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

我猜diffSetstd::set。如果是这样,那就是问题:std::set将元素存储为 const 对象,这意味着指向的对象std::set::iterator只读的。你不能写信给它。

使用std::vectorstd::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 函数的通常用法是在 sorted 上std::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 回答