-1

私は友達推薦アルゴリズムを書いていますが、一部std::pairはC++のデータ型を使用して350のランダムな友情を保存する必要があります。私は基本的に隣接リストを使用します(ベクトルのベクトルとして実装されます)。データ型を格納するベクトルを作成しますpair<int,int>。隣接リストからランダムな値を選択し、その友達の1つをランダムに選択します。ただし、データ型をペアとしてプッシュすることは確実ですが、反復することはできません。

考えられる理由は何でしょうか?

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を混在させないでください。

最初のサイズ変更は、listForPRを350個のゼロ化されたアイテムで埋めます。次に、push_backはベクトルの最後にアイテムを追加します。

サイズ変更ステートメントを削除すると、問題が修正されます。さらに良い解決策は、リザーブを使用することです(挿入用にベクター内のバッファーを準備するだけです)。

于 2012-05-23T20:01:51.913 に答える