2012-01-23 4 views
2

Я пытаюсь имитировать словарь python в C++. Например, я хочу построить что-то вродеСоздание многоуровневого словаря: перевод на 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

Петля над контейнером так же просто, как итерация с начала() до конца(). Тип итератора предоставляется типом контейнера, добавляя :: 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

любой особой причины для предпочтения '' map' из list's в 'multimap'? –

+0

@Zhenya. Ничего, о чем я заботился. –

+0

@JohanLundberg. Я хотел бы расширить свой вопрос, спросив, как вы можете хранить несколько типов данных внутри карты? например, теперь мы объявляем map > на этой карте мы можем сохранить ключ строки и значение типа списка, теперь скажем, что я хочу иметь {"someval": ["val1"], "somval2": «строка здесь», «someval3»: 24}. Я нашел ссылку [CODE] [http://www.dreamincode.net/forums/topic/129708-c-map-with-multiple-data-types/]. Увидев эту ссылку, я думаю что-то вроде map >. – Rkz

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

с C++ 11, да. –