【问题标题】:Iterating Multiple Multimaps迭代多个多图
【发布时间】:2014-12-07 22:29:29
【问题描述】:

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

代码如下:

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 个子类。我不知道为什么会发生错误。迭代器有问题吗?

非常感谢!!!

【问题讨论】:

  • 您能否向我们展示您是如何填充您的多图以及如何创建Deposit&lt;Product&gt; 指针的?
  • 我添加了更多信息。让我知道是否还有什么我可以给的。谢谢。
  • 好的,类定义被证明非常有用:它不是分配,而是您定义 getter 成员函数的方式。

标签: c++ segmentation-fault multimap


【解决方案1】:

您遇到的问题非常糟糕:getConnections() 按值返回多图。

这意味着对deposit.at(j)-&gt;getConnections() 的连续调用指的是原始多图的不同临时副本。因此,在第一个临时副本开头创建的迭代器永远不会匹配第二个副本的结尾,除非首先非法访问一些无效位置。

两种选择:

  • 如果您想在副本上进行迭代,请制作一份本地副本 auto cnx = deposit.at(j)-&gt;getConnections(); 并更改您的内部循环以在 cnx 上进行迭代。

  • 如果您打算迭代原始多图,请更改 getConnections() 的签名以返回引用。

顺便说一句,如果您使用 c++11 或更高版本,您可以考虑以更易读的方式定义迭代器:for (auto it = ....) 甚至更好,使用 Norah Attkins 提出的 range-for 语法在她的回答中。

【讨论】:

    【解决方案2】:

    如果您有 c++11(或 14)编译器(并且您应该 - 除非涉及工作/公司障碍)考虑使用基于范围的 for 循环来使您的代码更清晰

    for (auto const& elem : deposit) 
    {
        for (auto const& product : elem) 
        {
        }
    }
    

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

    【讨论】:

    • 尽管这是完全有效和真实的,但它没有回答 OP 的问题,看起来更像是评论。
    猜你喜欢
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2019-05-05
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多