gpt4 book ai didi

c++ - 迭代多个 multimap

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:51:45 25 4
gpt4 key购买 nike

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

代码如下:

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;
}

存储类 - 这是我填充 multimap 的地方。

(...)
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() 按值返回一个 multimap 。

这意味着对 deposit.at(j)->getConnections() 的连续调用指的是原始 multimap 的不同临时拷贝。因此,在第一个临时拷贝的开头创建的迭代器将永远不会匹配第二个拷贝的结尾,而无需首先非法访问某些无效位置。

两种选择:

  • 如果您想迭代一个拷贝,制作一个本地拷贝 auto cnx = deposit.at(j)->getConnections(); 并更改您的内部循环以迭代 cnx .

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

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

关于c++ - 迭代多个 multimap ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27348647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com