C++对数据类型问题

C++ pair data type issue

本文关键字:问题 数据类型 C++      更新时间:2023-10-16

我正在编写一个朋友推荐算法,在一部分我必须使用C++中std::pair数据类型存储 350 个随机友谊。我基本上使用邻接列表(实现为向量的向量)。我创建了一个存储数据类型的向量 pair<int,int> .我从邻接列表中选择一个随机值并随机选择它的朋友之一,但是,即使我很确定我将数据类型推送为对,但我无法迭代它。

可能的原因是什么?

int FRIENDS_AND_UNFRIENDS_TO_STORE=350,randomNode=rand()%adjacencyList.size(),randomFriend;
vector< pair<int,int> >listForPR;
listForPR.resize(FRIENDS_AND_UNFRIENDS_TO_STORE*2);
for(int i=0;i<FRIENDS_AND_UNFRIENDS_TO_STORE;i++) {
    while(adjacencyList[randomNode].size()<1)
        randomNode=rand()%adjacencyList.size();
    randomFriend=rand()%adjacencyList[randomNode].size();
    listForPR.push_back(make_pair(randomNode,adjacencyList[randomNode][randomFriend]));
}
for(int i=0;i<350;i++)
    cout<<"Node #"<<listForPR[i].first<<" & It's Friend: "<<listForPR[i].second<<endl;

添加了这个并神秘地解决了问题;

for(int i=0;i<FRIENDS_AND_UNFRIENDS_TO_STORE;i++) {
    while(adjacencyList[randomNode].size()<1)
        randomNode=rand()%adjacencyList.size();
    randomFriend=rand()%adjacencyList[randomNode].size();
    pair<int,int> temp=make_pair(randomNode,adjacencyList[randomNode][randomFriend]);//added
    listForPR.push_back(temp);
}

您的向量包含您在循环期间推送的 350/2 = 175 个元素,但在迭代时您将经历 350 个元素。

您不应该混合调整大小和push_back。

第一次调整大小将填充 listForPR 包含 350 个清零项。然后push_back将项添加到矢量的末尾。

删除调整大小语句应该可以解决问题。更好的解决方案是使用保留(它只是在向量中准备缓冲区以进行插入)。