什么是"std::set<int,int>::iterator"?
What is a `std::set<int,int>::iterator`?
我在网上看到了以下看起来很奇怪的代码片段(简化(。
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> myset{1, 2, 3, 4, 5};
set<int, int>::iterator it = myset.begin();
cout << *it << endl;
return 0;
}
我刚刚验证了它的编译和运行。(执行时打印1
(
我不理解迭代器类型的定义。
将myset
定义为set<int, int> myset;
是无效的,因为set
类型声明的第二个可选模板参数必须是支持bool operator()(int& const lhs, int& const rhs) const
的比较器。
但是为什么迭代器定义没有失败呢?它的底层容器不应该与目标容器具有相同的类型吗?
第二个模板参数无效是正确的。这违反了容器的先决条件,使整个容器具有未定义的行为。但总的来说,这里有几件事需要解释,所以我们可以对此进行一些推理。关键点是:
-
实例化必须以某种方式使用无效的模板参数来触发失败。它必须在与类定义一起实例化的地方使用。并不是整个类都是实例化的。一个著名的例子是成员函数bodies。这些仅在实际调用时根据需要进行实例化。
-
iterator
类型可以是别名。此外,它可能是几个不同的集合专门化共享的类型的别名。在这种情况下,::iterator
只依赖于第一个模板参数并非不可想象。这意味着您创建的类型可能与其他begin
返回的类型相同。
但最终,这是一个格式错误的程序。混合来自不同容器的迭代器本身是未定义的,但在此之前也存在先决条件冲突。总而言之,这不值得强调,因为这样的代码除了在智力练习中不应该出现在任何地方。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- EASTL矢量<向量<int>>连续的
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- 'structstd::对<int,int>'没有名为'push_back'