Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 比较两个C+的性能成本+;迭代器_C++_Performance_C++11_Stl_Iterator - Fatal编程技术网

C++ 比较两个C+的性能成本+;迭代器

C++ 比较两个C+的性能成本+;迭代器,c++,performance,c++11,stl,iterator,C++,Performance,C++11,Stl,Iterator,通常,在两个STL容器迭代器之间进行相等比较的性能代价是什么?我只是说定义的操作;也就是说,比较引用同一对象的两个迭代器 我的具体用例是,我有一个std::map,它可能包含非常大的元素、大量的元素,或者两者兼而有之。如果这样一个映射上的两个迭代器之间的相等比较有我不知道的隐藏惩罚,它可能会影响代码的性能。大多数STL容器operator==()只是原始指针比较。这是毫无意义的,除非是为了边界检查。此外,如果您比较来自不同容器的迭代器,这是未定义的行为 若重写此运算符或使用外部比较函数,则性能取

通常,在两个STL容器迭代器之间进行相等比较的性能代价是什么?我只是说定义的操作;也就是说,比较引用同一对象的两个迭代器


我的具体用例是,我有一个
std::map
,它可能包含非常大的元素、大量的元素,或者两者兼而有之。如果这样一个映射上的两个迭代器之间的相等比较有我不知道的隐藏惩罚,它可能会影响代码的性能。

大多数STL容器
operator==()
只是原始指针比较。这是毫无意义的,除非是为了边界检查。此外,如果您比较来自不同容器的迭代器,这是未定义的行为

若重写此运算符或使用外部比较函数,则性能取决于要比较的对象的大小

可能我把你的问题搞错了,现在还不完全清楚“迭代器比较”是什么意思,你的用例是什么。

一般来说,比较两个迭代器的性能取决于STL的实现

<>但是,关于时间复杂度,C++标准提出了限制输入迭代器的比较(因此正向迭代器、双向迭代器和随机存取迭代器)需要分期固定时间。特别是,这意味着对于
std::map
,不能通过比较键的相等性来比较其迭代器,因为这与键的长度是线性的。

迭代器操作的状态是

24.2.1概述[迭代器.要求.概述]

8所有类别的迭代器只需要那些 可在固定时间内(摊销)对给定类别进行变现。 因此,迭代器的需求表没有 复杂性列

如果查看迭代器操作的签名,则没有对应于底层元素
T
本身的参数或返回类型,只需要
T*
T&
。即使是
操作符==
也不必直接比较两个任意大的元素
T
本身


然而,这并没有给出迭代器操作的硬实时上界。特别是迭代器可以,但这些调试模式安全防护通常可以在发布版本中忽略。

这并不是什么意思。比较两个迭代器的唯一方法是测试两个迭代器是否都指向同一个元素。这并没有说明执行此操作的成本(或成本)有多高comparison@jalf然而,它说,在实践中,一些O(n)比较或对指针的比较是极不可能的(我认为这是OP之后的场景)。@ChristianRau不,这个答案没有说明任何问题。它只是说比较两个C++迭代器的成本是测试它们是否相等(这是明显的,没有帮助的)的代价,它可以和比较两个指针一样简单。@ Jalf,但是如果它可以,为什么不应该,你不能期望更精确的答案无论如何,正如第一句话所说的那样。(但我在另一个答案中看到,你至少可以从标准中得到O(1)。@ChristianRau:是的,我可以期待一个更精确的答案。例如,我可以期待你所说的,它必须是一个常数时间操作。或者我可以期待一个指定不考虑对象值的答案,因此元素类型是(或者每个元素的大小)是不相关的。我可以期待一些实际的信息,而不是冗长的“啊,谁知道”啊,很好的答案,加上引号。我想这就是我想要的答案。