在 C++ 中设置迭代器

Set Iterators in C++

提问人:Asif Azad 提问时间:7/18/2020 最后编辑:songyuanyaoAsif Azad 更新时间:7/19/2020 访问量:693

问:

可以在 c++ 中为集合 stl 减去迭代器吗?就像在矢量中是可能的一样......

int32_t main()
{
    set<int> s = {1, 3, 0, 23};
    vector<int> v = {1, 3, 0, 23};

    int vind = find(v.begin(), v.end(), 1) - v.begin(); //This is ok with no error

    int sind = find(s.begin(), s.end(), 1) - s.begin();  //But this gives error
    cout<<vind <<" " << sind;
    return 0;
}

我无法弄清楚原因。为什么在集合中是不可能的??

C++ 迭代器 std

评论

2赞 john 7/18/2020
因为鉴于集合迭代器的性质,减法无法有效地实现。可以使用 std::d istance 函数。 但请注意,调用此函数所需的时间与返回的索引成正比。换句话说,它是一种线性时间运算,而不是恒定时间运算。sind = std::distance(find(s.begin(), s.end(), 1), s.begin());
0赞 john 7/18/2020
@Evg 谢谢,我在不得不使用该函数的几个场合犯了同样的错误。

答:

4赞 songyuanyao 7/18/2020 #1

的迭代器是 BidirectionalIterator,它不支持迭代器之间。(的迭代器是 RandomAccessIterator,它支持这一点。std::setoperator-std::vector

您可以改用 std::d istance。(请注意,InputIterator(包括 BidirectionalIterator)的复杂度是线性的。

int sind = std::distance(s.begin(), find(s.begin(), s.end(), 1));