C++ 使用set_difference时出现编译错误 std::set tradedSymbolSet; //.. //贸易符号已填充 //.. 设置符号; //... //符号已填充 //.. 设置差异(tradedSymbolSet.begin(),tradedSymbolSet.end(), symbols.begin()、symbols.end()、diffSet.begin());
我得到这个编译错误: 错误C2678:二进制“=”:未找到接受“const std::basic_string”类型的左侧操作数的运算符(或没有可接受的转换)C++ 使用set_difference时出现编译错误 std::set tradedSymbolSet; //.. //贸易符号已填充 //.. 设置符号; //... //符号已填充 //.. 设置差异(tradedSymbolSet.begin(),tradedSymbolSet.end(), symbols.begin()、symbols.end()、diffSet.begin());,c++,stl,C++,Stl,我得到这个编译错误: 错误C2678:二进制“=”:未找到接受“const std::basic_string”类型的左侧操作数的运算符(或没有可接受的转换) 抱怨set_difference函数的用法。我无法获取我猜diffSet是std::set。如果是这样,那就是问题:std::set将元素存储为常量对象,这意味着std::set::iterator指向的对象是只读的。你不能给它写信 使用std::vector和std::back\u插入器作为: std::set<std::stri
抱怨set_difference函数的用法。我无法获取我猜
diffSet
是std::set
。如果是这样,那就是问题:std::set
将元素存储为常量对象,这意味着std::set::iterator
指向的对象是只读的。你不能给它写信
使用std::vector
和std::back\u插入器作为:
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());
std::vector<std::string> diff;
std::set_difference(tradedSymbolSet.begin(), tradedSymbolSet.end(),
symbols.begin(), symbols.end(), std::back_inserter(diff));
或者,将图元插入到现有集合中,如下所示:
std::set<std::string> diffSet(diff.begin(), diff.end());
std::set existingDiffSet;
//一些代码。。。
现有的diffset.insert(diff.begin(),diff.end());
希望有帮助。您没有显示diffSet
的定义,但是如果
表示它是一个std::set
,您不能分配给它。这个
迭代器返回的对象类型始终为常量。
还有一个问题是,你是不是
分配给存在。如果没有(diffSet.size()
小于
结果中的元素数)和分配为
如果允许,您将有未定义的行为(但可能发生崩溃);如果
他们这样做了,并且允许分配,修改
std::set
很可能不可侵犯内部不变量
关于订单
set函数通常用于排序的std::vector
,
使用用于输出的插入迭代器:
std::set<std::string> existingDiffSet;
//some code...
existingDiffSet.insert(diff.begin(), diff.end());
std::vector tradedSymbols;
//填充贸易符号
排序(tradedSymbols.begin(),tradedSymbols.end());
向量符号;
//填充符号
排序(symbols.begin()、symbols.end());
std::向量差异;
设置差异(tradedSymbols.begin(),tradedSymbols.end(),
symbols.begin(),symbols.end(),
标准:背部插入器(差异);
您也可以使用std::set,但必须更改
插入器到std::插入器(diffs,diffs.end())
(请注意,您可以对向量进行排序,而不是进行排序。)
插入过程中,使用std::lower_bound
查找点
插入。但是,如果要一次性填充,请使用
std::sort
之后可能更有效。)你忘了把它包括在内了吗?@Bathsheba:包括在内了。diffSet
const
?@PeterWood:好地方:那就是聪明的钱所在。@PeterWood是diffSet
一个std::set
?这很可能是问题的根源。您可以在std::set
上使用set函数,尽管它并不像在排序向量中使用set函数那样惯用。如果他真的需要一套,而使用set\u difference
就是其中之一,这就是我要走的路线。如果他正在做大量的set…
,我建议将所有内容转换为vector
,并保持它们的排序。好吧,实际上你不需要std::vector
,如果你已经了解了插入迭代器,那么一个简单的std::inserter(diffSet,diffSet.end())
就可以了,克里斯蒂安罗:我现在意识到了。希望读者阅读你的评论(以及詹姆斯的回答,其中也提到了这一点)。
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 ) );