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

标签 c++ iterator set c++14 c++-standard-library

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

#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;
}

我刚刚验证了this compiles and runs 。 (执行时打印 1)

我不明白迭代器类型定义。

定义mysetset<int, int> myset;作为 set 的第二个可选模板参数无效类型声明必须是支持 bool operator()(int& const lhs, int& const rhs) const 的比较器.

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

最佳答案

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

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

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

但归根结底,这是一个格式错误的程序。混合来自不同容器的迭代器本身是未定义的,但在此之前您还存在先决条件违规。总而言之,这不是什么值得强调的事情,因为这样的代码不应该出现在除了智力练习之外的任何地方。

关于c++ - 什么是 `std::set<int,int>::iterator` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58586602/

相关文章:

c++ - 打印出错误的值

c++ - SDL 切换全屏显示框架

c++ - 开源网络摄像头库

c++ - 从 awk 输出中获取 C++ 值

java - 使用 HashMap 迭代器

java - 如何初始化和访问集合对象数组

c++ - 最简单但完整的 CMake 示例

java - 如何循环遍历 List<Pair>> 迭代器

Java 链表并发修改异常

SQL 计算重叠集的不同元素