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

标签 c++ c++11 language-lawyer

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/

相关文章:

c - 标准和禁食整数等价

c++ - 获取当前目录,我可以在不知道最大缓冲区大小的情况下进行吗?

c++ - 带有 MinGW 4.8 的 Windows 上的模板 undefined reference

c++ - 为什么 GCC 对这些片段的处理方式不同?

c++ - 返回变量类型取决于 sizeof... 参数包

c++ - 为什么当我试图返回引用时我的对象仍然被复制

c++ - 构建/销毁过程中的虚拟调用

c++ - 未实现的纯虚方法问题

c++ - 在 QMediaPlayer 中使用资源文件

c++ - 使用声明 : one more bug of gcc and clang?