2

我正在尝试模仿 C++ 中的 python 字典。例如,我想构建类似的东西

{"The Dark Night Rises": {"year": 2012, "StoryLine": "this is the story.....", "Genres": ["action","crime","Thriller"]}}

我正在使用 STL 地图和列表来构建这种字典。但我不确定如何使用迭代器。有人可以帮我举一个构建上述字典的例子吗?我开始像下面这样构建一个简单的字典,如{"cast":["action","crime","Thriller"]}. 我很困惑如何构建上述多级词典,并专门对其进行迭代。

#include<iostream>
#include<string>
#include<map>
#include<iterator>
#include<list>

using namespace std;

class MultiLevDict
{
private:
    list<string> lis;
    map<string,list<string> > MultiDict;
public:
    void Setter();
    void Display() const;
};

void MultiLevDict::Setter()
{
    string field;
    string cast;
    int sizeCast;
    cout<<"enter the field of the movie:";
    cin>>field;
    cout<<endl;
    cout<<"how many cast are there in this movie?:";
    cin>>sizeCast;
    for (int i=0; i<sizeCast; i++)
    {
        cin>>cast;
        lis.push_back(cast);
    }
    MultiDict[field]=lis;

}

void MultiLevDict::Display() const
{
    list<string>::iterator lisIt;

}
4

2 回答 2

2

在容器上循环就像从 begin() 到 end() 迭代一样简单。迭代器类型由容器的类型通过添加 ::iterator 或 ::const_iterator 来提供。

这是一个完整的例子。我试图坚持你的代码。请注意有关 C++11 中新语法的注释。

#include<iostream>
#include<string>
#include<map>
#include<iterator>
#include<list>

using namespace std;

class MultiLevDict
{
private:
    list<string> lis;
    map<string,list<string> > MultiDict;
public:
    void Setter();
    void Display() const;
};

void MultiLevDict::Setter()
{
    string field;
    string cast;
    field="Abcd ";
    lis.push_back("Tom");
    lis.push_back("Eve");
    MultiDict[field]=lis;
// This works in C++11 :
    MultiDict["Efgh "]={"Joe","Lisa"};

}

void MultiLevDict::Display() const
{
   for(map<string,list<string> >::const_iterator it=MultiDict.begin();
       it!=MultiDict.end();++it){
      std::cout << "key: was: "<<it->first<<std::endl;
      for (list<string>::const_iterator it2=it->second.begin();
       it2!=it->second.end();++it2){
     std::cout << "   "<<it->first<< " contains " <<*it2<<std::endl;
      }
   }   
}

int main() {
   MultiLevDict myd;
   myd.Setter();
   myd.Display();   
}

结果是

key: was: Abcd 
  Abcd  contains Tom
  Abcd  contains Eve
key: was: Efgh 
  Efgh  contains Joe
  Efgh  contains Lisa
于 2012-01-23T23:10:37.223 回答
0
void MultiLevDict::Display() const
{
    for (auto x : MultiDict)
        for (auto y : x.second)
            cout << x.first << ": " << y << endl;
}
于 2012-01-23T23:41:28.517 回答