C++ 迭代器(下一个)
C++ Iterator ( Next )
我有这段代码,我正在使用它来了解 C++ Next 迭代器如何在具有结构的键值映射上工作。我想不出如何:
当键“test”的结构值为 0 时,iter->val 恰好为 1
next->val 正好是 0
谁能帮我理解一下。
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
#include <unordered_map>
#include <set>
#include<unordered_set>
using namespace std;
struct test {
int val;
unordered_set<string> st;
};
int main()
{
list <test> tst;
unordered_map < string , list<test>::iterator > m;
m["test"] = tst.insert(tst.begin() , {0 , {"test"}});
auto iter = m["test"] , next = iter++;
cout << iter->val << endl; // prints 1 . Not sure how
cout << next->val << endl; // prints 0 not sure how also
}
cout << iter->val
使您的程序具有 未定义的行为 。在 iter++
之后它将指向 tst.end()
并且取消引用 end()
是“非法的”。
cout << next->val
没问题,因为 next
指向 tst
.
中存在的一个元素
您首先使用 val=0 和 st={"test"} 创建一个结构测试。它被插入到列表 tst
中,因此它现在有一个条目。 return 值是一个指向新元素的迭代器,被放入 m["test"]。所以你的无序映射有一个条目“test”,它是 tst
的迭代器。现在,乐趣开始了...
auto iter = m["test"];
iter
成为指向 tst
.
第一个元素的迭代器的引用
auto next = iter++;
现在发生了两件事:首先 next
获得了 iter
的副本,现在还指向 tst
的第一个元素。其次 iter
递增(post 递增)以指向列表中的下一项。由于不再有它现在指向 tst::end()
.
现在让我们回答关于输出结果的问题:
cout << iter->val << endl; // prints 1 . Not sure how
这是未定义的行为。您不能使用 operator->() end()
。它指向内存中的某个地方,随机包含 0,所以你得到 0。幸运的是你的猫没有怀孕。
cout << next->val << endl; // prints 0 not sure how also
因为实际上一点 UB 不会损害您的程序继续和访问 next
。因为 next
指向被访问的 tst
的第一个元素。 tst
的第一个元素是 {.val = 0; .st={"test"}}
所以 next->val
输出 0.
您确定要 unordered_map 个迭代器而不是 unordered_map 个列表吗?
我有这段代码,我正在使用它来了解 C++ Next 迭代器如何在具有结构的键值映射上工作。我想不出如何: 当键“test”的结构值为 0 时,iter->val 恰好为 1 next->val 正好是 0
谁能帮我理解一下。
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
#include <unordered_map>
#include <set>
#include<unordered_set>
using namespace std;
struct test {
int val;
unordered_set<string> st;
};
int main()
{
list <test> tst;
unordered_map < string , list<test>::iterator > m;
m["test"] = tst.insert(tst.begin() , {0 , {"test"}});
auto iter = m["test"] , next = iter++;
cout << iter->val << endl; // prints 1 . Not sure how
cout << next->val << endl; // prints 0 not sure how also
}
cout << iter->val
使您的程序具有 未定义的行为 。在 iter++
之后它将指向 tst.end()
并且取消引用 end()
是“非法的”。
cout << next->val
没问题,因为 next
指向 tst
.
您首先使用 val=0 和 st={"test"} 创建一个结构测试。它被插入到列表 tst
中,因此它现在有一个条目。 return 值是一个指向新元素的迭代器,被放入 m["test"]。所以你的无序映射有一个条目“test”,它是 tst
的迭代器。现在,乐趣开始了...
auto iter = m["test"];
iter
成为指向 tst
.
auto next = iter++;
现在发生了两件事:首先 next
获得了 iter
的副本,现在还指向 tst
的第一个元素。其次 iter
递增(post 递增)以指向列表中的下一项。由于不再有它现在指向 tst::end()
.
现在让我们回答关于输出结果的问题:
cout << iter->val << endl; // prints 1 . Not sure how
这是未定义的行为。您不能使用 operator->() end()
。它指向内存中的某个地方,随机包含 0,所以你得到 0。幸运的是你的猫没有怀孕。
cout << next->val << endl; // prints 0 not sure how also
因为实际上一点 UB 不会损害您的程序继续和访问 next
。因为 next
指向被访问的 tst
的第一个元素。 tst
的第一个元素是 {.val = 0; .st={"test"}}
所以 next->val
输出 0.
您确定要 unordered_map 个迭代器而不是 unordered_map 个列表吗?