2

ここでやろうとしているのは、以下のような構造の 2 つのリストを比較することです。また、2 人が少なくとも 3 つの利害を共有している場合、それらをペアにして、ペアのリストに入れる必要があります。リストの最初の女の子から始めて、それを男の子と比較します。ペアが見つかった場合、それらをペアリストに入れ、それぞれの男の子リスト/女の子リストから削除します。

 struct Person {
        char name[30];
        enum gendertype gender;
        TableOfIntrests intrests; //The tableofintrests consists of an array with 6 containters representing six diffrent intrests.
    };

とにかく、私が抱えている問題は、プログラムが人のマッチングとペアの作成の 50% 程度で動作することです。残りの約 50% には、「List iterator not dereferancable」というエラー メッセージが表示されます。エラーメッセージをグーグルで検索しましたが、どうすればよいかわかりません。たぶん、私は完全に間違っていると考えているか、もっと良い方法で行うことができます.

void pair_together(Personlist *girllist, Personlist *boylist, Pairlist *pairlist, int            least_number_of_intrests)
{

int equal_intrests = 0; 
Pair pair;
Person p, p2;
int testcount3=0;
std::list<Person>::iterator i = girllist->begin();
std::list<Person>::iterator end = girllist->end();

std::list<Person>::iterator i2 = boylist->begin();
std::list<Person>::iterator end2 = boylist->end();
while ((i  != end))
{
    testcount3=0;
    if(i2==end2)
        break;

    equal_intrests = number_of_equal_intrests(i->intrests, i2->intrests);   //number_of_equal_intrests return the number of intrests that the two persons shares.   




    if(equal_intrests >= least_number_of_intrests)
    {           
        printf("%s + %s, ", i->name, i2->name);
        printf("%d\n", equal_intrests);
        equal_intrests =0;

        create_person(&p, i->name, i->gender);
        create_person(&p2, i2->name, i2->gender);
        create_pair(&pair, p, p2);
        pairlist->push_back(pair);
        i =girllist->erase(i);
        i2 =boylist->erase(i2);//--
        i2=boylist->begin();



        testcount3=1;

    }

     else if(testcount3!=1)
    {
        i2++;

    }

     if((i2==end2) && (equal_intrests < least_number_of_intrests))
    {
        i++;
        i2=boylist->begin();

    }

      if(number_of_intrests(i->intrests) <least_number_of_intrests)//number_of_intrests returns how many intrests a person have, so if the person have less intrests than least_number_of_intrests the program just skips to the next person.
    {           
        i++;            
    }




}

}

4

2 に答える 2

0

リストを繰り返し処理しながらリストから消去しているため、イテレータが混乱します。代わりに、リストのコピーを作成してください。オリジナルを繰り返しますが、コピーから消去します。完了したら、オリジナルを破棄し、コピーを保管してください。

編集: コピーを作成する必要はありません。「i」イテレータをリセットする方法については正しいです。安全です。ただし、リストから消去する場合は、「end」変数に新しい値を設定する必要があります。

于 2013-08-05T14:28:08.223 に答える