抱歉,因为这个问题不是很高级,但我很难理解为什么这个程序会这样工作。
#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/