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

What is a `std::set<int,int>::iterator`?

本文关键字:int gt iterator 什么 lt std set      更新时间:2023-10-16

我在网上看到了以下看起来很奇怪的代码片段(简化(。

#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的比较器。

但是为什么迭代器定义没有失败呢?它的底层容器不应该与目标容器具有相同的类型吗?

第二个模板参数无效是正确的。这违反了容器的先决条件,使整个容器具有未定义的行为。但总的来说,这里有几件事需要解释,所以我们可以对此进行一些推理。关键点是:

  1. 实例化必须以某种方式使用无效的模板参数来触发失败。它必须在与类定义一起实例化的地方使用。并不是整个类都是实例化的。一个著名的例子是成员函数bodies。这些仅在实际调用时根据需要进行实例化。

  2. iterator类型可以是别名。此外,它可能是几个不同的集合专门化共享的类型的别名。在这种情况下,::iterator只依赖于第一个模板参数并非不可想象。这意味着您创建的类型可能与其他begin返回的类型相同。

但最终,这是一个格式错误的程序。混合来自不同容器的迭代器本身是未定义的,但在此之前也存在先决条件冲突。总而言之,这不值得强调,因为这样的代码除了在智力练习中不应该出现在任何地方。