2

この単純なコードでコンパイル エラーが発生します

「エラー 1 エラー C3892: 'std::_Tree_const_iterator<_Mytree>::operator *' : const である変数に割り当てることはできません」

std::set<int> s1;
std::set<int> s2;
std::set<int> s3;
std::set_union(s1.begin() , s1.end() , s2.begin() , s2.end() , s3.begin());

このページをフォローしましたが、何が間違っていたのかわかりません。

http://www.cplusplus.com/reference/algorithm/set_union/

4

2 に答える 2

4

セット内のアイテムは効果的constです。セット内でそれらを変更することはできません。変更すると、他のセット メンバーに対する順序が変更される可能性があるためです (これは不変条件に違反します)。項目を変更するには、通常、セットから項目を削除し、変更してから、変更したバージョンをセットに挿入します (再挿入時に正しい順序になるようにします)。

少なくともメモリが機能する場合、標準では a が aset<T>::iteratorと同等である必要はありませんがconst_iterator、許可されており、コンパイラは明らかにそれを利用しています。

いずれにせよ、ほぼ確実に必要なのはinsert_iterator、アルゴリズムからの結果をセットに入れることです。

std::set_union(s1.begin() , s1.end() , s2.begin() , s2.end() , std::inserter(s3, s3.begin());
于 2013-07-13T20:49:49.320 に答える
4

s3.begin()でラップする必要がありますstd::inserter(s3, s3.begin())

std::inserterあなたを呼び出す挿入イテレータを構築insertします。ただし、より効率的な方法は次のstd::set_unionとおりです。

s1.insert(s2.begin(), s2.end()); 

変更s1したくなく、別のセットが必要な場合を除きます。

于 2013-07-13T20:48:24.540 に答える