【问题标题】:i get compile error while using set_difference使用 set_difference 时出现编译错误
【发布时间】:2013-06-16 23:44:44
【问题描述】:
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>' 类型的左侧操作数的运算符(或没有可接受的转换)”

抱怨 set_difference 函数的使用。我无法得到

【问题讨论】:

  • 你忘了#include 吗?
  • @Bathsheba : 包括在内..
  • diffSet const?
  • @Peter Wood:好地方:这就是聪明的钱所在。
  • @PeterWood 是diffSet 还是std::set?这很可能是问题的根源。

标签: c++ stl


【解决方案1】:

你没有显示diffSet 的定义,但是如果,作为它的名字 表示,它是一个std::set,你不能分配给它。这 迭代器返回的对象的类型始终为 const。 还有一个问题是你是不是元素 分配存在。如果他们不这样做(diffSet.size() 小于 结果中的元素数量),分配是 允许,您将有未定义的行为(但可能会崩溃);如果 他们这样做了,并且允许分配,修改中的条目 std::set 可能会违反内部不变量 关于订单。

set 函数的常用用法是 on 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 可能效率更高。)

【讨论】:

    【解决方案2】:

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

    希望对您有所帮助。

    【讨论】:

    • 可以std::set 上使用 set 函数,尽管它并不像使用排序向量那样惯用。如果他真的需要一套,并且使用set_difference 是其中之一,这就是我要走的路线。如果他做了很多set_...,我建议将所有内容都转换为vector,并保持排序。
    • 好吧,如果您已经研究过插入迭代器,您实际上并不需要 std::vector,一个简单的 std::inserter(diffSet, diffSet.end()) 也可以。
    • @ChristianRau:我现在意识到了。希望读者阅读您的评论(以及詹姆斯的回答,其中也提到了这一点)。
    猜你喜欢
    • 2020-09-19
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多