【问题标题】:Why do vector::iterator and set::iterator work different? [duplicate]为什么 vector::iterator 和 set::iterator 的工作方式不同? [复制]
【发布时间】:2023-03-06 09:12:01
【问题描述】:

为什么我可以这样做

vector<int> a;
//...
cout << a.end()-a.begin();

但我不能对 set::iterator 做同样的事情?

【问题讨论】:

  • 骗子目标说的是std::map,但std::set在这方面完全一样。
  • 具体来说,std::vector 迭代器是 random access iterators,而对于 std::set,它们只是 bidirectional iterators
  • 最终,一旦我们得到 C++20 的 contiguous_iterator,我们就能很好地提出这个问题。恕我直言,幸运的是,您可以在 C++20 之前以定义的方式使用向量执行此操作(或者通过了解更多关于 std::vector 需要组织自身的方式):减去指针只有在它们指向同一数组中的元素。作为恕我直言重新打开,“重复”更多的是参考。
  • @Bathsheba:这听起来不对,因为没有人在谈论指针。 a.end()-a.begin() 对于std::dequeue 也有很好的定义,即使它是连续的。

标签: c++ iterator


【解决方案1】:

为什么 vector::iterator 和 set::iterator 的工作方式不同?

因为一个容器具有快速随机访问,而另一个则没有。并且因为结果,一个迭代器是随机访问迭代器,而另一个不是。不保证双向迭代器支持减法。

您可以使用std::distance 实现相同的效果,它适用于所有输入迭代器。但您需要注意,它对于非随机访问迭代器具有线性复杂性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 2016-06-09
    • 2020-07-23
    相关资源
    最近更新 更多