首页 > 解决方案 > C ++中的对迭代器列表

问题描述

#include <bits/stdc++.h>
using namespace std;

int main() {
    unordered_map< int,list<pair<int,int>>> adjList;
    adjList[1].push_back(make_pair(2,2));
    adjList[1].push_back(make_pair(4,-1));
    adjList[0].push_back(make_pair(1,3));
    for(pair<int,int> neighbour : adjList[1]){
        pair<int,int>* it = &neighbour;
       std::advance (it,1);
       cout<<it->first<<" ";    //1)showing random value twice instead of 4(-1113715584 -1113715584) 
    }
    for (list<pair<int,int>>::iterator i=adjList[1].begin(); i!=adjList[1].end(); i++)
        cout<<*i.first;         //2)list<std::pair<int, int> >::iterator'has no member named 'first'
    }
}
  1. 它显示正确的值(2,4),没有{std::advance (it,1);}它应该将迭代器带到下一个头,但它每次都显示一些随机值两次。
  2. 错误:' std::__cxx11::list<std::pair<int, int> >::iterator'{aka' struct std::_List_iterator<std::pair<int, int> >'} 没有名为' first''的 成员cout<<*i.first;

标签: c++c++11c++17c++14

解决方案


您在这里调用未定义的行为

   pair<int,int>* it = &neighbour;
   std::advance (it,1);
   cout<<it->first<<" ";

这是同样的问题

   std::pair<int,int> p;
   std::pair<int,int>* ptr = &p;
   ptr += 1;                     // ok-ish 
   std::cout << ptr->first;      // undefined behavior !!

当指针指向数组中的元素时,您只能递增指针以获得有效指针。增加指向单个对象的指针很好,因为草率地说,一对可以被视为大小为 1 的数组,并且允许在数组的最后一个元素之后获得一个指针。但是,您不应取消引用该指针。

Astd::list不会将其元素存储在连续内存中。您可以在例如 astd::vector中获取指向元素的指针,然后将其推进以获取指向下一个元素的指针。但是,您所取的地址实际上并不是列表中的元素。当你写

for(pair<int,int> neighbour : adjList[1]){

然后neighbour是列表中元素的副本。它是单一的pair,完全无关的list。如果你用过

for(pair<int,int>& neighbour : adjList[1]){

然后neighbour将是对列表中元素的引用,但由于上述原因,您的代码仍然是错误的。


第二个错误是由于拼写错误。*i.first*(i.first),但你想要(*i).firstor i->first


最后但并非最不重要的一点是,考虑到std::make_pair它的用例比 C++11 之前的用例少得多。您的案例不是其中之一,您可以简单地写:

adjList[1].push_back({2,2});

此外,我建议您阅读为什么我不应该#include <bits/stdc++.h>为什么是“使用命名空间标准;被认为是不好的做法?.


推荐阅读