2011-01-19 6 views
2

У меня есть следующий пример:возвращение итератора из функции

#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

Почему? Недействителен ли итератор? Зачем? Заранее спасибо.

ответ

8

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

mit myfind(mi &mymap) { ... 

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

+0

спасибо. кто это сделал. – user581243

+0

@user: Вы можете прочитать [Как передать объекты в функции на C++?] (Http://stackoverflow.com/questions/2139224/how-to-pass-objects-to-functions-in-c/ 2139254 # 2139254). – sbi

1

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

Смежные вопросы