Ошибка "Нет совпадения для оператора" на простой разнице итератора
Вот мой код:
#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 ответа
Поскольку эта операция не может быть эффективно реализована на std::set
, это не предусмотрено. std::set
предоставляет (постоянные) двунаправленные итераторы, которые можно перемещать в любом направлении, но не прыгать на произвольные расстояния, как итераторы произвольного доступа, предоставляемые std::vector
, Вы можете увидеть иерархию концепций итераторов здесь.
Вместо этого используйте std::distance
функции, но имейте в виду, что для этого случая это O(n)
операции, проходя каждый шаг между двумя итераторами, так что будьте осторожны при использовании этого на больших std::set
s, std::list
с и т. д.
std::set
итераторы являются двунаправленными итераторами, а не случайными. Первые не определяют operator-
, использование std::distance
рассчитать разницу между итераторами.
#include <iterator>
// ...
auto x = std::distance(st.begin(), st.find(1));