c++ - 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'
}
}
- 它显示正确的值(2,4),没有
{std::advance (it,1);}
它应该将迭代器带到下一个头,但它每次都显示一些随机值两次。 -
错误:'
std::__cxx11::list<std::pair<int, int> >::iterator
'{aka'struct std::_List_iterator<std::pair<int, int> >
'} 没有名为'first
''的 成员cout<<*i.first;
解决方案
您在这里调用未定义的行为:
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).first
or i->first
。
最后但并非最不重要的一点是,考虑到std::make_pair
它的用例比 C++11 之前的用例少得多。您的案例不是其中之一,您可以简单地写:
adjList[1].push_back({2,2});
此外,我建议您阅读为什么我不应该#include <bits/stdc++.h>
?为什么是“使用命名空间标准; ” 被认为是不好的做法?.
推荐阅读
- html - 垂直对齐和 CSS 网格关系
- html - 如何传递来自soap xml的rgb值将其转换为xsl并传递rgb值
- r - 如何激活调试器或访问 Jupyter 笔记本中的日志?
- node.js - 用于字符串分类的张量流与弹性搜索
- jquery - Jquery AJAX - iRail API liveboard 错误
- python - 测试值是否包含在具有混合类型的 Pandas 系列中
- c# - 调试 WebMethod()s - 从调用项目中单步执行代码
- python - 如何用发票ID替换Odoo 8中的发票编号序列
- javascript - jsx 中 SVG 中道具的正确语法
- data-structures - 支持在 O(1) 中查找 2 个索引之间的最大数的数据结构