2016-09-27 1 views
1

私がここで間違っていることを見て、私の深みから少し出ているように見えないようです。C++ 11レンジベースのマルチマップループ - 非constペアを返しません

私が持っているものは、ベクトルとマルチマップを含むいくつかのデータ構造です。

元のデータへのポインタを含む2番目のベクトル/マルチマップを作成して、2番目のベクトル/マップを編集すると元のデータが変更されるようにします。この理由は、リストがいくつかの基準に基づくorigの一時的なサブセットであるということです。

は、まず、私はベクトルでこれを試してみました、動作しているようですが、ここでは実施例である:ここでは

std::vector<std::string> strVect; 
strVect.push_back("test1"); 
strVect.push_back("test2"); 
strVect.push_back("test3"); 
std::vector<std::string *>strpVect; 
for (std::string &str : strVect) 
{ 
    strpVect.push_back(&str); 
} 

、strVectでオリジナルにstrpVectポイントの要素。私はこれを実行すると、私はそれのconst作る場合、それは動作します、私はエラーinvalid init of non-const reference of type std::pair....

を得る今

std::multimap<int, std::string> strMap; 
strMap.insert(std::pair<int, std::string>(1, "test1")); 
strMap.insert(std::pair<int, std::string>(2, "test2")); 
strMap.insert(std::pair<int, std::string>(3, "test3")); 
std::multimap<int, std::string *>strpMap; 
for (std::pair<int, std::string> &val : strMap) // <<<<< error here 
{ 
    strpMap.insert(std::pair<int, std::string *>(val.first, &val.second)); 
} 

は、今私はmultimapのためのものと同じ種類のをやりたい

std::multimap<int, std::string> strMap; 
strMap.insert(std::pair<int, std::string>(1, "test1")); 
strMap.insert(std::pair<int, std::string>(2, "test2")); 
strMap.insert(std::pair<int, std::string>(3, "test3")); 
std::multimap<int, std::string *>strpMap; 
for (const std::pair<int, std::string> &val : strMap) 
{ 
    strpMap.insert(std::pair<int, std::string *>(val.first, &val.second)); // <<<<< error here 
} 

しかし、私のインサートでは(明らかに私のために)エラーが出ますが、内部の値を変更したいのでconstを挿入したくありません。私はこれを私のコーディングの失敗として見ます:(

答えて

5

(マルチ)マップのキーはconstです。 したがって、

for (std::pair<const int, std::string> &val : strMap) 
{ 
    strpMap.insert(std::pair<int, std::string *>(val.first, &val.second)); 
} 

このトリックを行う必要があります。

あるいは、より良い(私見)、autoを使用します。

for (auto &val : strMap) 
{ 
    strpMap.insert(std::pair<int, std::string *>(val.first, &val.second)); 
} 

これは自動的にconst権利を取得します。

+0

すごくうれしいよ、おかげで:)私は "auto"キーワークが好きなだけ、それは2つの面倒な副作用があります:1.私はしばしば何が起こっているのか分かりませんon !, 2.コード補完の停止(少なくとも私のIDEでは)。 psはそれをマークするために6分を待たなければなりません...:o –

+1

人は自動車について異なる意見を持つことができます。その場合ここでは、なぜautoを使用するための主要な例の一つです。 'const std :: pair <...>&'は 'auto&'がコピー操作をしないうちにコピー操作を行います。 – Hayt

+0

@Hay私は「この場合」のように私は一種同意しません...もし私が自動車を使ったなら、私は誰も賢くないでしょう。今私は正しいタイプを使用していると私はそれを理解しています:) - しかし、それを働くことの面では、私はあなたのポイントを参照してください - 私はとにかくupvoteを行う:) –

3

マルチマップの値型は

pair<const key_type,mapped_type>は、あなたがそれを使用することができるはずです。

for (std::pair<const int, std::string> &val : strMap) 
{ 
    strpMap.insert(std::pair<int, std::string *>(val.first, &val.second)); 
} 

非constバージョンを使用できない理由は次のとおりです。

マップエントリは、キーによってソートされた方法で保存されます。後でキーを変更すると、そのキーは以前のソートされた位置にとどまるため、データを挿入しても検索で何も表示されないことがあります。これは、キーが挿入された位置を調べるためですが、キー値がリストに挿入された後でキー値を変更すると、後で一致しません。

+0

この回答をありがとう、それはまた、何が起こっているかを正確に説明しています:) –

関連する問題