我在尝试迭代某些地图时遇到了问题。 基本上我有一个存款类。每个存款类都有一个包含目的地存款和距离的多图。 (这将用于创建图表)。 当我尝试迭代所有地图时,我遇到了分段错误错误。
以下是代码:
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个子类。我不知道为什么会发生错误。迭代器有什么问题吗?
非常感谢!!!
答案 0 :(得分:0)
如果你有一个c ++ 11(或14)编译器(你应该 - 除非涉及工作/公司障碍),考虑使用基于范围的for
循环来使你的代码更清晰
for (auto const& elem : deposit)
{
for (auto const& product : elem)
{
}
}
除了造型师的指导,缺乏关于容器实际容纳的信息,我们只是猜测回答这个问题时出了什么问题。我的猜测是无效读取发生,你正在访问的指针没有被分配(但这是猜测)
答案 1 :(得分:0)
你遇到的问题非常讨厌:getConnections()
按值返回一个多图。
这意味着对deposit.at(j)->getConnections()
的连续调用会引用原始多图的不同临时副本。因此,在第一个临时副本的开头创建的迭代器将永远不会匹配第二个副本的结尾,而不会首先非法访问某些无效的位置。
两种选择:
如果要迭代副本,请创建一个本地副本auto cnx = deposit.at(j)->getConnections();
并更改内部循环以在cnx上进行迭代。
如果您打算迭代原始多图,请更改getConnections()
的签名以返回引用。
顺便说一句,如果你使用c ++ 11或更高版本,你可以考虑以更易读的方式定义迭代器:for (auto it = ....)
甚至更好,使用由Norah Attkins在她的回答中。