【问题标题】:Error C2676: std::set::const_iterator doesn't have operator+ function?错误 C2676:std::set::const_iterator 没有 operator+ 功能?
【发布时间】:2020-04-21 16:19:28
【问题描述】:
std::set<int> s = { 1,2,3,4,5 };
std::set<int> s2(s.begin(), s.begin() + 2);

我想将 s 的几个值分配给s2。但得到以下编译错误:

错误 C2676 二进制“+”: 'std::_Tree_const_iterator&lt;std::_Tree_val&lt;std::_Tree_simple_types&lt;_Ty&gt;&gt;&gt;' 未定义此运算符或转换为可接受的类型 预定义的

似乎std::set::const_iterator 没有operator+ 方法。

【问题讨论】:

  • 有道理,因为std::set 不支持随机访问。
  • std::set&lt;T&gt;::const_iterator 是一个常用的双向迭代器类。您可以递增/递减它的迭代器,但不能将它们视为随机访问。
  • 可以使用std::next获取第三个迭代器。

标签: c++ iterator operator-overloading c++-standard-library stdset


【解决方案1】:

看来std::set::const_iterator 没有operator+ 方法。

你是对的。

s.begin() + 2 等操作仅适用于 random access iterators(请参阅链接中的 表达式)。 但是,std::set 只有 bidirectional iteratorstd::set::iteratorstd::set::const_iterator)。


但是,您可以使用std::next 以通用方式完成这项工作,它返回我们传递的迭代器的nth 继任者。

#include <iterator>  // std::next

std::set<int> s2(s.begin(), std::next(s.begin(), 2));
// or const_iterator    
std::set<int> s3(s.cbegin(), std::next(s.cbegin(), 2));

【讨论】:

【解决方案2】:

sets 通常实现为树而不是连续的数据存储。使用树,您只能从进行中的项目中找到包含的项目,并且必须一次迭代一个,这使得 + 运算符不是很有效。因此他们只提供Bi-Directional Iterators

要获得有效的operator+,您需要一个可以提供Random Access Iterators 的容器

【讨论】:

    猜你喜欢
    • 2014-07-03
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    相关资源
    最近更新 更多