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>]()'います。

イテレータの違いが突然機能しなくなった理由がわかりません! ここで何か不足していますか?

4

2 に答える 2

9

この操作は では効率的に実装できないため、std::set提供されていません。std::setによって提供される Random Access Iteratorsのように、どちらの方向にも移動できますが、任意の距離をジャンプすることはできませんstd::vectorここでイテレータの概念の階層を確認できます。

代わりに関数を使用しますが、std::distanceこの場合、これはO(n)操作であり、2 つの反復子の間のすべてのステップを歩かなければならないことに注意してください。std::setstd::list

于 2015-04-21T06:16:19.370 に答える
5

std::setイテレーターはBidirectionalIteratorであり、RandomAccessIterator ではありません。前者は を定義しませんoperator-std::distanceイテレータ間の差を計算するために使用します。

#include <iterator>
// ...
auto x = std::distance(st.begin(), st.find(1));
于 2015-04-21T06:16:43.593 に答える