【问题标题】:Set Iterators in C++在 C++ 中设置迭代器
【发布时间】:2020-11-08 00:28:37
【问题描述】:

c++中的set 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;
}

我无法弄清楚原因。为什么在set里不行??

【问题讨论】:

  • 因为给定集合迭代器的本质,减法不能有效地实现。您可以使用 std::distance 函数。 sind = std::distance(find(s.begin(), s.end(), 1), s.begin()); 但请注意,调用此函数所花费的时间与返回的索引成正比。换句话说,它是线性时间运算,而不是恒定时间运算。
  • @Evg 谢谢我在不得不使用该功能的少数场合犯了同样的错误。

标签: c++ iterator set std


【解决方案1】:

std::set的迭代器是BidirectionalIterator,不支持迭代器之间的operator-。 (std::vector的迭代器是RandomAccessIterator,支持)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 2011-07-05
    • 2015-09-30
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多