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:binary'=':找不到运算符,它采用类型为'const std :: basic_string&lt; _Elem,_Traits,_Alloc&gt;'的左手操作数(或者没有可接受的转换)“
抱怨set_difference函数的用法。我无法得到
答案 0 :(得分:3)
我猜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());
希望有所帮助。
答案 1 :(得分:3)
您不会显示diffSet
的定义,而是显示其名称
表示,它是std::set
,您无法分配到其中。该
迭代器返回的对象的类型总是const。
还有一个问题是你是否有这些元素
分配存在。如果他们不(diffSet.size()
小于
结果中的元素数量)和赋值
允许,你有未定义的行为(但可能是崩溃);如果
他们这样做,并允许分配,修改一个条目
std::set
可能会使内部不变量无效
关于订单。
set函数的常用用法是在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
可能更有效率。)