"No match for operator-" 简单迭代器差异错误
"No match for operator-" error on simple iterator difference
这是我的代码:
#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>]()'
。
我想不通迭代器 difference 怎么突然停止工作了!我在这里遗漏了什么吗?
由于无法在 std::set
上有效地执行此操作,因此未提供。 std::set
提供 (Constant) Bidirectional Iterators, that can be moved in either direction, but not jumped arbitrary distances, like the Random Access Iterators provided by std::vector
. You can see the hierarchy of iterator concepts here.
相反,使用 std::distance
函数,但请注意,对于这种情况,这是一个 O(n)
操作,必须遍历两个迭代器之间的每一步,因此谨慎使用这在大 std::set
s、std::list
s 等
std::set
iterators are BidirectionalIterators, not RandomAccessIterators. The former do not define operator-
. Use std::distance
计算迭代器之间的差异。
#include <iterator>
// ...
auto x = std::distance(st.begin(), st.find(1));
这是我的代码:
#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>]()'
。
我想不通迭代器 difference 怎么突然停止工作了!我在这里遗漏了什么吗?
由于无法在 std::set
上有效地执行此操作,因此未提供。 std::set
提供 (Constant) Bidirectional Iterators, that can be moved in either direction, but not jumped arbitrary distances, like the Random Access Iterators provided by std::vector
. You can see the hierarchy of iterator concepts here.
相反,使用 std::distance
函数,但请注意,对于这种情况,这是一个 O(n)
操作,必须遍历两个迭代器之间的每一步,因此谨慎使用这在大 std::set
s、std::list
s 等
std::set
iterators are BidirectionalIterators, not RandomAccessIterators. The former do not define operator-
. Use std::distance
计算迭代器之间的差异。
#include <iterator>
// ...
auto x = std::distance(st.begin(), st.find(1));