3

C++で書かれたコード

環境:Microsoft Visual Studio

マップのベクトルがあります。まず、最初のマップを反復処理し、その「最初の」と「2番目の」を取得して、作成した他の構造(ベクトルのマップ)に保存します。次に、「マップのベクトル」の左側のマップを繰り返し処理して、同じことを行います...

これが私のマップのベクトルです:

typedef vector<map<string,unsigned int>> myvec;

そして、これがその仕事をするべき関数です:

void Coogle::make_index(const myvec& the_vec)
{
    //SCAN THE FIRST MAP
    map<string,unsigned int>::iterator map_iter;
    index::iterator idx_iter = the_index.begin();
    for(map_iter=the_vec[0].begin(); map_iter!=the_vec[0].end(); ++map_iter)
    {

    }
}

'for'ループは、ベクトルの最初のマップを反復処理する必要があります。マップを反復処理する必要があるため、マップイテレータを宣言しました。右?なぜ機能しないのですか?

エラー:

IntelliSense:これらのオペランドに一致する演算子"="はありません

どうもありがとう !!!


OK、このイテレータを特定しました。

index::iterator idx_iter = the_index.begin();

そして、これが私の「インデックス」です:

typedef map<string,vector<unsigned int>> index;

そして、前述の「for」ループ内で、次のことを行いました。

    for(map_iter=the_vec[0].begin(); map_iter!=the_vec[0].end(); ++map_iter)
    {
        /*#1*/ idx_iter->first = map_iter->first;
        /*#2*/ idx_iter->second[0] = map_iter->second;
        /*#3*/ idx_iter++;
    }

#2は大丈夫のようです。しかし、#1はエラーを生成します:

IntelliSense:これらのオペランドに一致する演算子"="はありません

以前と同じエラーなので、似たような問題だと思います。それは...ですか?

編集:より明確にするために、私がやりたいのは、const myvec&the_vecからインデックスの「i」の場所(この場合は「0」)に追加することです。

また :

typedef vector<map<string,unsigned int>> myvec;
typedef map<string,vector<unsigned int>> index;

ありがとうございました!

4

3 に答える 3

7

the_vec定数への参照として渡されるため、次が必要ですconst_iterator

map<string,unsigned int>::const_iterator map_iter;
于 2012-08-17T12:42:15.007 に答える
0

2番目の質問に答えるために、マップ内のキーを変更することはできません。キーは順番に保持する必要があるためです。インデックス内のすべての要素を置き換える場合は、最初にそれをクリアしてから、新しい要素を追加するのがおそらく最善です。

the_index.clear();
for(map_iter=the_vec[0].begin(); map_iter!=the_vec[0].end(); ++map_iter)
{
    the_index[map_iter->first].push_back(map_iter->second);
}
于 2012-08-17T15:26:54.450 に答える
0

mapsのキーとsのsの値を含むastringを反復処理する方法は次のとおりです。vectorstring

for( map<string, vector<string>>::iterator ii = timeZonesMap.begin(); ii != timeZonesMap.end(); ++ii)
{
    cout << ii->first << ": " << endl;
    for(std::vector<string>::iterator it = ii->second.begin(); it != ii->second.end(); ++it) {
        std::cout << *it << endl;
    }
}

うまくいけば、これは将来誰かを助ける

于 2013-08-06T16:43:20.853 に答える