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

Вот мой код:

#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>]()',

Я не могу понять, как различие итераторов перестало работать внезапно! Я что-то здесь упускаю?

1

Решение

Поскольку эта операция не может быть эффективно реализована на std::set, это не предусмотрено. std::set обеспечивает (Константа) двунаправленные итераторы, которые можно перемещать в любом направлении, но не прыгать на произвольные расстояния, как итераторы произвольного доступа, предоставляемые std::vector, Вы можете увидеть иерархию понятий итератора Вот.

Вместо этого используйте std::distance функции, но имейте в виду, что для этого случая это O(n) операции, проходя каждый шаг между двумя итераторами, так что будьте осторожны при использовании этого на больших std::sets, std::listс и т. д.

9

Другие решения

std::set итераторы BidirectionalIterators, не RandomAccessIterators. Первые не определяют operator-, использование std::distance рассчитать разницу между итераторами.

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector