使用set_difference时出现编译错误

时间:2013-06-20 07:57:00

标签: c++ stl

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函数的用法。我无法得到

2 个答案:

答案 0 :(得分:3)

我猜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());

希望有所帮助。

答案 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可能更有效率。)