c++ - 使用映射的迭代器混淆

标签 c++ maps

抱歉,因为这个问题不是很高级,但我很难理解为什么这个程序会这样工作。

#include <iostream>
#include <fstream>
#include <set>
#include <vector>
#include <map>

using namespace std;

int main() {
    ofstream fout("castle.out");
    ifstream fin("castle.in");
    map<int, int, greater<int> > cnt;
    map<int, int, greater<int> >::iterator x;
    x = cnt.begin();
    cnt[1] = 0;
    cnt[2] = 7;
    fout << x->first; //This outputs 2
    x++;
    fout << x->second;//This outputs 2 again, why not 0?

    return 0;
}

于是我定义了一个叫cnt的map,然后为它做了一个迭代器x。我按最大整数到最小整数排序。我将该迭代器设置为等于 x.begin(),然后使用 first 输出 x 的值。但是后来我想输出值0,所以我做了一个x++;然后尝试输出 x->first 的值。这背后的想法是迭代器将增加一个并指向我的映射中的下一对,因此它会指向 1,它位于 2 之后。

为什么不行再给我2?

我意识到如果我这样做:

x++;
x++:
fout << x-> first;

如果有两个 x++,我的值为 1。这是为什么呢?谢谢!

最佳答案

您的代码有未定义的行为。

x = cnt.begin();

在容器为空时将 x 设置为 begin(),这有效地为您提供了 end() 迭代器。由于 std::map::operartor[] 不会使任何迭代器失效,您仍然有一个 end() 迭代器并且取消引用它是未定义的行为。

关于c++ - 使用映射的迭代器混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48874447/

相关文章:

javascript - 如何使用 JavaScript 获取 Google map 上两个形状之间的最短距离?

C++:从文本文件中读取

C++ 全局数组和非全局数组之间的区别(Stackoverflow 异常)

c++ - 使用 std::copy 复制单个字符

c++ - 3点的平面方程式未返回正确值

r - 测试几何图形是否至少有一个共同的边界点而不管内部点如何(不像 `gTouches` )

java - 谷歌地图 Android 缩放到国家

java - 如何在国家 map 上显示和捕获用户选择

android - 使用 Apple( map )URL Scheme 时,非 iOS 设备会发生什么情况?

CoW、继承类和可变共享数据的 c++ 设计模式?