“不匹配运算符 - ”简单迭代器差异的错误

时间:2015-04-21 06:12:09

标签: c++ c++11 iterator c++14 const-iterator

这是我的代码:

#include <set>
#include <iostream>
using namespace std;

int main(){
    set<int> st;
    st.insert(1);
    int x = st.find(1) - st.begin();

    return 0;
}

我收到error: no match for 'operator-' in 'st.std::set<_Key, _Compare, _Alloc>::find [with _Key = int, _Compare = std::less<int>, _Alloc = std::allocator<int>](((const int&)((const int*)(&1)))) - st.std::set<_Key, _Compare, _Alloc>::begin [with _Key = int, _Compare = std::less<int>, _Alloc = std::allocator<int>]()'

我无法弄清楚迭代器差异是如何突然停止工作的!我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:9)

由于此操作无法在std::set上有效实施,因此未提供此操作。 std::set提供(Constant) Bidirectional Iterators,可以向任意方向移动,但不会跳过任意​​距离,例如std::vector提供的随机访问迭代器。您可以看到迭代器概念的层次结构here

相反,使用std::distance函数,但请注意,对于这种情况,这是一个O(n)操作,必须沿着两个迭代器之间的每一步走,所以要谨慎使用它大std::set s,std::list s等

答案 1 :(得分:5)

std::set迭代器是BidirectionalIterators,而不是RandomAccessIterators。前者没有定义operator-。使用std::distance计算迭代器之间的差异。

#include <iterator>
// ...
auto x = std::distance(st.begin(), st.find(1));