Ошибка "Нет совпадения для оператора" на простой разнице итератора

Вот мой код:

#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));
Другие вопросы по тегам