возвращая итератор из функции - PullRequest
2 голосов
/ 19 января 2011

У меня есть следующий пример:

#include <stdio.h>
#include <map>
#include <conio.h>

typedef std::map<int,int> mi;
typedef std::map<int,int>::iterator mit;

mit myfind(mi mymap)
{
    mit it = mymap.find(1);
    printf("in function: %d\n",it->second);

    return it;
}

void main()
{
    mi a;
    a.insert(std::pair<int,int>(1,2));
    a.insert(std::pair<int,int>(3,4));

    mit it = myfind(a);

    printf("out of function: %d\n",it->second);

    _getch();

}

Выход:

в функции: 2

не работает: -17891602

Зачем?Итератор становится недействительным?Зачем?Заранее спасибо.

Ответы [ 2 ]

8 голосов
/ 19 января 2011

Ваш возвращенный итератор указывает куда-то на локальную копию mymap, которая была передана в myfind() (которая освобождается, когда функция возвращается). Попробуйте:

mit myfind(mi &mymap) { ...

Это передаст ссылку на mymap, и копия не будет сделана.

1 голос
/ 19 января 2011

Вы передаете карту по значению. Поэтому myfind () работает с копией карты, и итератор действителен только для этой копии. Вместо этого передайте карту по ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...