迭代多个多重贴图

Iterating Multiple Multimaps

本文关键字:迭代      更新时间:2023-10-16

我在尝试迭代某些地图时遇到问题。基本上我有一个存款类。每个存款类都有一个包含目的地存款和距离的多重地图。(这将用于创建图形)。当我尝试迭代所有地图时,我收到分段错误错误。

代码如下:

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) 
    {
    }
}

除了造型师的指导,缺乏关于容器实际容纳的信息,我们只是猜测回答这个问题时出了什么问题。我的猜测是发生了无效读取,并且您正在访问的指针未分配(但这是一个猜测)