gpt4 book ai didi

c++ - C++11 标准是否要求通过常量 unordered_container 的两次迭代以相同的顺序访问元素?

转载 作者:IT老高 更新时间:2023-10-28 12:32:09 25 4
gpt4 key购买 nike

for (auto&& i : unordered_container)
{ /* ... */ }

for (auto&& i : unordered_container)
{ /* .. */ }

标准是否要求这两个循环以相同的顺序访问元素(假设容器未修改)?


我对这个问题的分析……

我阅读了标准,并且尽我所能告诉答案是“否”...

由于容器的迭代器是正向的,因此有一种语言需要 a==b 暗示 ++a==++b 用于正向迭代器。这意味着如果两次迭代都从同一个地方开始,它们将通过相同的路径。这将问题简化为标准是否需要 container.begin() == container.begin() 的不同问题。我找不到任何需要这个的语言。

最佳答案

实现 operator==() 需要容器。那是我们可以做到的:

container c;
c == c;

该关系必须与以下内容相同:

std::distance(a.begin(), a.end()) == std::distance(b.begin(), b.end()) &&
std::equal(a.begin(), a.end(), b.begin());

这里的重要部分是对 std::equal() 的调用。此调用要求对 container.begin() 的两次独立调用将产生相同的值序列。如果不是,那么 c == c 将是错误的,这没有任何意义,因为 == 是等价关系。

因此,我的回答是,我们可以声称该标准要求 any 容器的两次传递必须导致相同的排序。显然,如果您执行任何更改容器或使迭代器无效的操作,则此要求会中断。

引文:

  • C++ 2011 表 96 - 容器要求

关于c++ - C++11 标准是否要求通过常量 unordered_container 的两次迭代以相同的顺序访问元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25536376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com