0
std::set<std::string> tradedSymbolSet; 
//..
// tradedSymbols is filled
//..
std::set<std::string> symbols;
//...
// symbols is filled
//..

std::set_difference(tradedSymbolSet.begin(), tradedSymbolSet.end(), 
        symbols.begin(), symbols.end(), diffSet.begin());

私はこのコンパイルエラーを受け取ります:

「エラー C2678: バイナリ '=': 型 'const std::basic_string<_Elem,_Traits,_Alloc>' の左側のオペランドを取る演算子が見つかりません (または、受け入れ可能な変換がありません)」

set_difference 関数の使用法について不平を言っています。私は得ることができませんでした

4

2 に答える 2

4

だと思いdiffSetますstd::set。もしそうなら、それが問題です:std::set要素をconstオブジェクトとして格納します。つまり、が指すオブジェクトstd::set::iterator読み取り専用です。書き込みはできません。

std::vectorとを次のように使用しstd::back_inserterます。

std::vector<std::string> diff;

std::set_difference(tradedSymbolSet.begin(), tradedSymbolSet.end(), 
         symbols.begin(), symbols.end(), std::back_inserter(diff));

を取得したらdiff、次のようにオブジェクトdiffSetを作成できます。

std::set<std::string> diffSet(diff.begin(), diff.end());

または、要素を次のように既存のセットに挿入します。

std::set<std::string> existingDiffSet;
//some code...

existingDiffSet.insert(diff.begin(), diff.end());

それが役立つことを願っています。

于 2013-06-20T08:03:08.640 に答える
3

の定義は表示されませんdiffSetが、その名前が示すように、それが である場合、それstd::setに割り当てることはできません。イテレータによって返されるオブジェクトの型は常に const です。割り当てている要素が存在するかどうかという問題もあります。そうでない場合 (diffSet.size()結果の要素数よりも少ない)、割り当てが許可されている場合、未定義の動作が発生します (ただし、クラッシュする可能性があります)。そうであり、割り当てが許可されている場合、 のエントリを変更するとstd::set、順序に関する内部不変条件に違反する可能性があります。

set 関数の通常の使用法は sortedstd::vectorで、出力用の挿入イテレータを使用します。

std::vector<std::string> tradedSymbols;
//  fill tradedSymbols
std::sort( tradedSymbols.begin(), tradedSymbols.end() );
std::vector<std::string> symbols;
//  fill symbols
std::sort( symbols.begin(), symbols.end() );

std::vector<std::string> diffs;
std::set_difference( tradedSymbols.begin(), tradedSymbols.end(),
                     symbols.begin(), symbols.end(),
                     std::back_inserter( diffs ) );

std::set も使用できますが、挿入子を に変更する必要がありますstd::inserter( diffs, diffs.end() )

(ソートの代わりに、 を使用して挿入ポイントを見つけることにより、挿入中にベクトルをソートしたままにすることができることに注意してくださいstd::lower_bound。ただし、一度に入力する場合は、 std::sort後で を使用する方がおそらく効率的です。)

于 2013-06-20T08:12:22.117 に答える