迭代多个多重贴图
Iterating Multiple Multimaps
我在尝试迭代某些地图时遇到问题。基本上我有一个存款类。每个存款类都有一个包含目的地存款和距离的多重地图。(这将用于创建图形)。当我尝试迭代所有地图时,我收到分段错误错误。
代码如下:
for (int j = 0; j < deposit.size(); j++) {
for (typename multimap< Deposit<Product>*, int>::iterator it = deposit.at(j)->getConnections().begin(); it != deposit.at(j)->getConnections().end(); it++) {
cout << "From the depo. " << deposit.at(j)->getKey() << " to " << it->first->getKey() << " with the distance " << it->second << endl;
}
}
编辑:
存款类别:
template<class Product>
class Deposit {
private:
multimap <Deposit<Product>*, int> connections;
public:
void addConnection(Deposit<Product>* dep, int dist);
multimap <Deposit<Product>*, int> getConnections() const;
};
(...)
template<class Product>
void Deposit<Product> ::addConnection(Deposit<Product>* depKey, int dist) {
this->connections.insert(pair<Deposit<Product>*, int>(depKey, dist));
}
template<class Product>
multimap < Deposit<Product>*, int> Deposit<Product> ::getConnections() const {
return this->connections;
}
存储类 - 这是我填充多重地图的地方。
(...)
ligs = rand() % 10;
do{
ligIdx = rand() % deposit.size();
dist = rand() % 100;
deposit.at(i)->addConnection(deposit.at(ligIdx), dist);
ligs--;
}while(ligs>0);
(...)
我的存款类有2个子类。我不知道为什么会发生错误。迭代器有问题吗?
谢谢!!!
你遇到的问题非常讨厌:getConnections()
按值返回一个多映射。
这意味着对deposit.at(j)->getConnections()
的连续调用引用原始多重映射的不同临时副本。 因此,在第一个临时副本的开头创建的迭代器永远不会与第二个副本的结尾匹配,除非首先非法访问一些无效位置。
两种选择:
-
如果要循环访问副本,请创建一个本地副本
auto cnx = deposit.at(j)->getConnections();
并将内部循环更改为在 CNX 上进行迭代。 -
如果要迭代原始多映射,请更改
getConnections()
的签名以返回引用。
顺便说一下,如果你使用 c++11 或更高版本,你可以考虑以更易读的方式定义迭代器:for (auto it = ....)
甚至更好,使用 Norah Attkins 在她的答案中提出的 range-for 语法。
如果你有一个 c++11(或 14)编译器(你应该 - 除非涉及工作/公司障碍),请考虑使用基于范围的for
循环来使你的代码更清晰
for (auto const& elem : deposit)
{
for (auto const& product : elem)
{
}
}
除了造型师的指导,缺乏关于容器实际容纳的信息,我们只是猜测回答这个问题时出了什么问题。我的猜测是发生了无效读取,并且您正在访问的指针未分配(但这是一个猜测)
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 迭代时从向量和内存中删除对象
- 如何在c++迭代器类型中包装std::chrono
- 带过滤器的现代迭代c++集合
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- C++矢量迭代
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 擦除while循环中迭代的元素
- 实现一个在集合上迭代的模板函数
- 对于set上的循环-获取next元素迭代器
- 在向量内的向量上迭代
- 为什么output_editor Concept不需要output_e迭代器标记
- TSP递归解的迭代形式
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器