Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用set_difference时出现编译错误 std::set tradedSymbolSet; //.. //贸易符号已填充 //.. 设置符号; //... //符号已填充 //.. 设置差异(tradedSymbolSet.begin(),tradedSymbolSet.end(), symbols.begin()、symbols.end()、diffSet.begin());_C++_Stl - Fatal编程技术网

C++ 使用set_difference时出现编译错误 std::set tradedSymbolSet; //.. //贸易符号已填充 //.. 设置符号; //... //符号已填充 //.. 设置差异(tradedSymbolSet.begin(),tradedSymbolSet.end(), symbols.begin()、symbols.end()、diffSet.begin());

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

我得到这个编译错误:

错误C2678:二进制“=”:未找到接受“const std::basic_string”类型的左侧操作数的运算符(或没有可接受的转换)


抱怨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 ) );