通常,两个STL容器迭代器之间的相等比较的性能成本是多少?我只谈论定义的操作;也就是说,比较两个引用同一对象的迭代器。
我的具体用例是我有std::map
可能有非常大的元素,很多元素,或两者兼而有之。如果这个映射上的两个迭代器之间的相等比较具有我不知道的隐藏惩罚,则可能会影响我的代码的性能。
答案 0 :(得分:5)
通常,比较两个迭代器的性能取决于STL的实现。
但是,关于时间复杂度,C ++标准强加了输入迭代器(以及前向迭代器,双向迭代器和随机访问迭代器)的比较采用分摊的常量时间的限制。特别是,对于std::map<std::string, int>
,这意味着无法通过比较密钥来比较其迭代器,因为这与密钥的长度是线性的。
答案 1 :(得分:4)
大多数STL容器operator==()
只是原始指针比较。除非用于边界检查,否则这是没有意义的。更重要的是,如果你要比较来自不同容器的迭代器 - 它是未定义的行为。
如果覆盖此运算符或使用外部比较函数,性能取决于您要比较的对象的大小。
可能我的问题出错了,并不是100%明白“迭代器比较”是什么意思,你的用例是什么。
答案 2 :(得分:4)
draft Standard表示迭代器操作为amortized constant time
24.2.1一般[iterator.requirements.general]
8所有迭代器类别只需要那些函数 可以在固定时间内实现给定类别(摊销)。 因此,迭代器的需求表没有 复杂性专栏。
如果查看迭代器操作的签名,则没有与基础元素T
本身对应的参数或返回类型,只需要T*
和T&
。即使operator==
也不必直接比较两个任意大的元素T
本身。
但是,这并没有为迭代器操作提供硬实时上限。特别是,迭代器可以执行very costly bounds checking,但这些调试模式安全保护通常可以在发布版本中省略。