4

私は自分の構造体を次のように定義しました

struct element {

int id;
float value;
}

と一緒に使用していstd::setます。set_differenceアルゴリズムを使用したい(2つのセットの違いを判別するための前の質問ですでに述べたように。コードを呼び出そうとすると、コンパイルが停止し、次のエラーメッセージが表示されます。

/usr/include/c++/4.2.1/bits/stl_algobase.h:268: error: passing 
'const element' as 'this' argument of 'element& element::operator=(const element&)' 
discards qualifiers

最小限の例は次のようになります。

std::set<struct element> s1;
std::set<struct element> s2;
std::set<struct element> s3;

element e1 = { 1, 11.0 };
element e2 = { 2, 22.0 };
element e3 = { 3, 33.0 };

s1.insert(e1);
s1.insert(e2);
s2.insert(e2);
s2.insert(e3);

set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), s3.begin());
4

1 に答える 1

12
set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(),
               std::inserter(s3, s3.begin()));
//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

例: http: //ideone.com/B4Cc1

s3.begin()出力イテレータとして配置することにより、セットの前部領域をセットの差で上書きすることを意味します。上書きするには、セットのサイズを結果よりも大きくする必要がありますが、これはほとんどの場合正しくありません。セットが空でない場合でもs3.begin()、イテレータは読み取り専用であるため、出力として使用できません(そうしないと、ソートされた順序が破棄されます)。

OTOHは、std::inserter(x, cit)この出力イテレータが割り当てられるたびに(*it = y)、insertメソッドが呼び出されることを意味します(x.insert(cit, y))。これは本当に必要なことです。空からセットにデータを入力します。

于 2011-12-11T17:20:29.447 に答える