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 个列表吗?