-1

我正在编写一个朋友推荐算法,其中一部分我必须使用std::pairC++ 中的数据类型存储 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);
}
4

2 回答 2

1

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

于 2012-05-23T18:15:51.510 回答
0

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

第一次调整大小用 350 个零项填充 listForPR。然后 push_back 将项目添加到向量的末尾。

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

于 2012-05-23T20:01:51.913 回答