为什么`std::set<T>::end()` 不等于`std::set<T>::iterator{}`?

hl037_

编译此代码:

#include <set>
#include <iostream>

int main(int argc, char * argv[]){
  std::set<int> test;

  std::cout << (test.end() == std::set<int>::iterator{}) << std::endl;
  std::cout << (test.begin() == std::set<int>::iterator{}) << std::endl;
  std::cout << (test.begin() == test.end()) << std::endl;

  return 0;
}

它输出(在 gcc 11.1 和 clang 12.0.0 上测试):

0
0
1

...但是,如果我参考https://timsong-cpp.github.io/cppwp/n4659/iterators#forward.iterators-2

前向迭代器的 == 域是相同底层序列上的迭代器的域。但是,值初始化的迭代器可以进行比较,并且应该与相同类型的其他值初始化的迭代器进行比较。[ 注意:值初始化的迭代器的行为就像它们在同一空序列的末尾之后引用一样。— 尾注 ]

...然后std::set<int>::iterator{}是我理解的“值初始化”(请注意,我使用临时变量得到相同的结果),我希望输出为:

1
1
1

我错过了什么?

杰夫加勒特

前向迭代器的 == 域是相同底层序列上的迭代器的域。

所以...可以将来自同一序列的迭代器与==.

但是,值初始化的迭代器可以进行比较,并且应该与相同类型的其他值初始化的迭代器进行比较。

所以...可以将两个相同类型的值初始化迭代器与==.

注意:值初始化的迭代器的行为就像它们在同一空序列的末尾之后引用一样。

注释不是规范性的,但它描述的是对您隐藏了一些空序列,并且值初始化的迭代器的行为好像它们指的是过去这个序列的结束迭代器。

这就是说,就好像标准库为自己实例化了 astd::set<int>并且一个值初始化的迭代器引用了.end()那个。

注释与上述一致。如果值初始化的迭代器表现得好像它们都指向同一个序列,那么在同一点,它们将是可比较的并且比较相等。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么std :: set似乎强制使用const_iterator?

什么是`std :: set <int,int> :: iterator`?

为什么是SomeClass <?超级T>不等于Java泛型类型中的SomeClass <T>吗?

如果无法修改set元素,为什么std :: set提供begin()和end()

set<shared_ptr<T>>::iterator 到 set<shared_ptr<T const>>::const_iterator

为什么numeric_limits <uint16_t> :: max()不等于-1?

为什么std :: ops :: Shl :: shl不等于<<?

为什么从采用std :: ranges :: output_range的算法返回std :: ranges :: safe_iterator_t而不是std :: ranges :: safe_subrange_t

具有缩放t分布的GAMM:为什么我的残差和拟合值不等于观测值?

为什么vector :: iterator和set :: iterator工作不同?

为什么 Sets 的 keys() 值不等于 Symbol.iterator,而 kyes 值等于 Symbol.iterator

为什么不能将std :: function用作std :: set或std :: unordered_set值类型?

默认的(T)枚举值不等于null

将std:set <int32_t>复制到std :: set <uint32_t>的好方法

为什么不能互换std :: atomic <T>?

为什么std :: is_aggregate <T>是聚合的?

我从std :: set获取const_iterator而不是迭代器

删除std :: set <vector <string >> :: iterator的索引处的值

std :: set <...> :: iterator上的OMP和并行操作

为什么“ std :: is_pointer <std :: nullptr_t> :: value”等于false?

如何证明Coq中的“ Type <> Set”(即Type不等于Set)?

为什么EnumMap <T> .keySet()返回Set <T>()而不返回EnumSet <T>()?

为什么 `std::set::extract` 不支持像 `std::set::find` 那样的异构查找?

为什么std :: set :: erase与std :: set :: insert不一致?

为什么std :: set_intersection不起作用?

为什么std :: set_difference无法删除重复项?

为什么无法“弹出”来自std :: set的项目?

为什么在GCC中对std :: set的推论失败?

为什么std:set(使用单个冒号)可以编译?