C ++对数据类型问题

时间:2012-05-23 18:09:14

标签: c++ data-structures std-pair

我正在编写一个朋友推荐算法,在一部分中,我必须使用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);
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你不应该混合使用resize和push_back。

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

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