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/