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 に答える