在无序地图中实现无序地图

时间:2014-09-07 20:43:00

标签: c++ unordered-map

我正在从文件中读取数据并尝试将其设置为另一个无序映射中的无序映射,以便我可以为特定值设置2个键。该文件包含顶点和从一个到另一个的距离。我正在使用此代码从文件中读取并创建有序地图,但它不起作用。我查找了如何实现无序地图的示例,但我没有在网上找到任何内容。

#include <iostream>
#include <vector>
#include <sstream>
#include <string>
#include <vector>
#include <unordered_map>
#include <set>


int main()
{
    std::unordered_map<std::string,std::unordered_map<std::string,int>> left_vertex;
    std::set<std::string> vertices;
    int i=0,j=0,distance = 0;
    std::string start_vertex = "",outer_key = " ",inner_key = " ";
    std::unordered_map<std::string,std::unordered_map<std::string,int>>::iterator it;
    std::set<std::string>::iterator it2;

    for(std::string line;std::getline(std::cin,line);)
    {
        std::stringstream line_stream(line);

        for(std::string token;std::getline(line_stream,token,' ');)
        {
            if(i==0)
            {
                start_vertex = token;
                break;
            }

            if(j==0)
            {
                outer_key = token;
                vertices.insert(outer_key);
            }

            if(j==1)
            {
                inner_key = token;
            }
            if(j==2)
            {
                distance = std::stoi(token);
            }
            j++;

        }

        for(it2 = vertices.begin();it2!=vertices.end();it2++)
        {
            if(*it2 == outer_key)
            {
                //left_vertex.insert(std::make_pair(outer_key,std::make_pair(inner_key,distance)));
                left_vertex[outer_key][inner_key]=distance;
            }
            else
            {
                left_vertex[outer_key] = std::make_pair(inner_key,distance);
            }
        }
        outer_key = " ";
        inner_key = " ";
        distance = 0;
        j=0;
        i++;

    }

    for(it = left_vertex.begin(); it != left_vertex.end();it++)
    {
        std::cout<<it->first<<std::endl;
    }

    return 0;
}

我正在阅读的文件看起来像这样。

A 
A B 1
A C 5
B C 2
B D 4
C D 1
C E 4
D E 2

第一行是起始顶点。之后,每行中的3个元素表示每行中从第一个元素到第二个元素的距离。

2 个答案:

答案 0 :(得分:0)

我在您的代码中遇到两个问题:

  • std::make_pair的行只是没有编译。
  • 您的打印策略对于这种复杂的双重映射是错误的。

除此之外,您的代码几乎完成了您希望它执行的操作 我冒昧地重新格式化它并使它变得更短更简单 - 你有几个不必要的for循环。

#include <iostream>
#include <sstream>
#include <string>
#include <unordered_map>

int main()
{
    std::unordered_map<std::string, std::unordered_map<std::string, int>> doubleMap;
    std::unordered_map<std::string, std::unordered_map<std::string, int>>::iterator it;
    std::unordered_map<std::string, int>::iterator it2;
    std::string key1, key2, distanceStr;

    std::string line;
    std::getline(std::cin, line); // Read the unwanted line
    while (std::getline(std::cin, line)) {
        std::stringstream line_stream(line);
        std::getline(line_stream, key1, ' ');
        std::getline(line_stream, key2, ' ');
        std::getline(line_stream, distanceStr, ' ');

        doubleMap[key1][key2] = std::stoi(distanceStr);
    }

    for (it = doubleMap.begin(); it != doubleMap.end(); ++it) {
        std::cout << it->first << std::endl;
        for (it2 = it->second.begin(); it2 != it->second.end(); ++it2) {
            std::cout << "  " << it2->first << " " << it2->second << std::endl;
        }
    }

    return 0;
}

输入文件时此代码的输出是:

A
  C 5
  B 1
D
  E 2
C
  D 1
  E 4
B
  D 4
  C 2

答案 1 :(得分:0)

带有双重unordered_map的数据结构很有用。但是,您使用的代码看起来有点过于复杂。

只需使用以下内容替换for(it2 ...)循环块:

    if (i!=0)   // for the first line the data is irrelevant
        left_vertex[outer_key][inner_key] = distance;  // just insert !  

在最后添加以下输出代码:

for (it = left_vertex.begin(); it != left_vertex.end(); it++) {
    std::cout << it->first << std::endl<<"\t";
    for (auto x : it->second)
        std::cout << x.first << x.second<<" ";
    cout << endl; 
}

允许结果:

A
        B1 C5
B
        C2 D4
C
        D1 E4
D
        E2

其他一些建议:

为了阅读line_stream,您还可以写一些像line_stream>>outer_key>>inner_key>>distance;这样会使计数器j和中间标记无用的东西。

如果顶点与inner_keys一致,您也可以在最后检查,因为目前无法确保这一点。