Итератор карты C ++ застрял в бесконечном цикле for - PullRequest
0 голосов
/ 22 апреля 2020

Я повторяю map в C++, используя for loop, но оно застревает в бесконечном l oop. Я искал другие похожие вопросы, и самый близкий из них этот вопрос , но ответ на этот вопрос не отвечает на мой запрос, потому что в этом вопросе автор вносит изменения в объект карты, но я не делаю любые изменения объекта карты во время for loop.

Мой код выглядит следующим образом (я пытался комментировать разные строки и обнаружил, что бесконечная l oop вызвана 11-й строкой (else statement), но я не мог не понять точную проблему):

int main(){
    map<int,int> dic; //dic is the relevant map object
    dic[0]=1; dic[1]=1; dic[2]=1; dic[3]=1; //dic = {0:1, 1:1, 2:1, 3:1}

    int k=1;
    int sol=0;

    for(map<int,int>::iterator iter=dic.begin(); iter!=dic.end(); iter++){
        int a=iter->first; int b=iter->second;
        if(k==0) sol+=b*(b-1)/2;
        else sol+=b*dic[a+k]; //after some trials, I found that problem is in this line but I couldn't figure out the problem
    }
    return sol;
}

1 Ответ

6 голосов
/ 22 апреля 2020

Эта строка:

sol+=b*dic[a+k];

делает добавление нового элемента в map, если ключ a+k не существует.

a здесь является ключом, поэтому dic[a] будет работать нормально. Однако, если k не равно 0, вы рискуете получить доступ к несуществующему элементу карты.

Используйте map::find, если хотите проверить существует ли конкретный ключ.

Кроме того, ваше наблюдение о том, что этот код приводит к бесконечному l oop, допустимо, но технически неверно. Тип ключа может иметь только конечное число значений, поэтому в конечном итоге l oop завершится. Это может занять довольно много времени. Это предполагает, что вы используете когда-либо только ключи, которые не переполняют int.

...