构建多层字典:从Python到C++的翻译

2 投票
2 回答
609 浏览
提问于 2025-04-17 10:55

我想在C++中模拟Python的字典。比如,我想创建一个像这样的东西:

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

我正在使用STL中的map和列表来构建这种字典。但是我不太确定该如何使用迭代器。有人能给我一个构建上面字典的例子吗?我开始做了一些简单的字典,比如{"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;

}

2 个回答

0
void MultiLevDict::Display() const
{
    for (auto x : MultiDict)
        for (auto y : x.second)
            cout << x.first << ": " << y << endl;
}

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

2

遍历一个容器就像从开始到结束一样简单。你可以通过在容器类型后面加上 ::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

撰写回答