0

修改:使代​​码更具可读性

我最近发布了一个关于嵌套 STL 映射的问题,但是我没有输入任何代码,所以我再次问了同样的问题(这次包含了代码)。任何帮助将不胜感激,并为垃圾邮件道歉。

过去 4 天我被困在某事上,现在我需要指导。

这是我的数据结构:

class demo1
{
    int a, b, c, d, e;
}

class demo2
{
    map(int, demo1) map1
}

map(string, demo2) map2;

vector< pair<int, demo1> > vec1;

现在,假设我有 2 个字符串变量(在 map2 的“key”中)和 3 个 int 变量(在 map1 的“key”中),我如何在 map2 和 map1 之间建立正确的映射

这是我期望的输出:

// Expected mapping output
string 1(key in map2)
int 1(key in map1) -> demo1
int2               -> demo1
int 3              -> demo1
string 2
int 1(key in map1) -> demo1
int2               -> demo1
int 3              -> demo1

这是代码的相关部分(上述数据结构在头文件中,这是我使用它们的主 .cpp 文件。实际代码很长,我只插入其中的相关部分)

class tmp1
{
    int a, b, c, d e;
} t1;

....

if(condition is true)
{
    string tmp_string // this string is a key in map2
    map2.insert(make_pair(tmp_string, demo2));
}

if(another condition is true)
{
    int n; // this is a "key" in map1
    demo 1 d1 // create an instance of class demo1
    d1.a =  t1.a;
    d1.b =  t1.b;
    d1.c =   t1.c;
    d1. d =   t1.e;
    d1.f  = t1.f;
    // Insert these value into map now
    map1.insert(make_pair(n, d1));
    vec1.push_back(make_pair(n, d1));  // vec1 is define above in the data structure section
}

这是我检查输出的方式

map(string, demo2)::iterator outer_itr;
map(int, demo1)::iterator inner_itr;

for(outer_itr = map2.begin(); outer_itr != map2.end(); outer_itr++)
{
    cout << "String is " << (*outer_itr).first << endl;
    vector < pair<int, demo1> >::iterator itr;
    for(itr = vec1.begin(); itr != vec1.end(); itr++)
    {
        cout << "Int key in map1 is " << (*itr).first           << endl;
        cout << "Value of a is      " << (*itr).second.second.a << endl;
        cout << "Value of b is      " << (*itr).second.second.b << endl;
        cout << "Value of c is      " << (*itr).second.second.c << endl;
    }
}

这是做映射的正确方法吗..?

4

1 回答 1

0

阅读后,我认为您的代码只是将 demo2 用作地图,正如@Leeor 所提到的,您正在复制地图功能,vec1但这实际上也发生在demo2. 所以你的最终解决方案应该消除vec1and demo2

有两种方法可以做到这一点:

如果您希望能够直接索引到 ademo1中,那么在您的代码中您将执行此操作,map2["string 1"].map1[1]那么您需要合并您的密钥

  • 所以你的容器看起来像这样:std::map< std::pair< std::string, int >, demo1 > map2
  • 索引如下所示: map2[std::make_pair("string 1", 1)]

如果您希望能够遍历附加到“字符串 1”的所有值,那么您的代码在 for 块中似乎正在执行的操作,那么您需要使用多映射

  • 所以你的容器看起来像这样:std::multimap< std::string, std::pair< int, demo1 > > map2
  • 插入看起来像这样:map2.insert( std::make_pair( 1, myDemo1 )
  • 你会得到一个std::pair作为first开始迭代器和second作为结束迭代器的迭代器,如下所示:auto itr = map2.equal_range( "string 1" )

如果您需要上述两种功能,则需要@jrok 提到的嵌套地图

于 2013-09-26T13:26:00.700 回答