Создание многоуровневого словаря: перевод с python на c ++ - PullRequest
2 голосов
/ 24 января 2012

Я пытаюсь имитировать словарь Python в C ++. Например, я хочу построить что-то вроде

{"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;

}

Ответы [ 2 ]

2 голосов
/ 24 января 2012

Цикл над контейнером так же прост, как итерация от 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
0 голосов
/ 24 января 2012
void MultiLevDict::Display() const
{
    for (auto x : MultiDict)
        for (auto y : x.second)
            cout << x.first << ": " << y << endl;
}
...