2013-01-13 2 views
2

У меня есть вопрос о структуре станд :: Карта: этот фрагмент кода работает правильно:C++ карта итераторов прыжковых элементов

map<string,int> mappa; 
int main(int argc, char** argv) { 
mappa["b"]=1; 
mappa["a"]=2; 
for(std::map<string,int>::iterator it=mappa.begin();it!=mappa.end();++it) 
{ 
    cout<<it->first<<"\n";  
} 
return 0; 
} 

выход:

a 
b 

, но если я делаю:

map<string,int> mappa; 
std::map<string,int> getList(){ 
return mappa; 
} 

int main(int argc, char** argv) { 
mappa["b"]=1; 
mappa["a"]=2; 
for(std::map<string,int>::iterator it=getList().begin();it!=getList().end();++it) 
{ 
    cout<<it->first<<"\n"; 
} 
return 0; 
} 

мой выход только

b 

Почему? Спасибо!

ответ

1

Вы вызываете getList несколько раз. Каждый раз, когда он создает новую карту, используя конструктор копирования.

Вы такие сделать это:

std::map<string,int> myList = getList(); 
const std::map<string,int>::iterator myListEnd = myList.end(); 
for(std::map<string,int>::iterator myList.begin();it!=myListEnd;++it) 
{ 

Я предполагаю, что вам требуется копия.

+0

Я не понимаю. У меня есть две копии одной и той же карты ... begin() и end() не возвращают одинаковые значения в обеих копиях? – volperossa

+0

@ user1973451 - В вашем вопросе ваша функция getList создает копию карты. Вы используете разные копии для инициализации итератора и разработки, когда он достигает конца. –

4

В цикле for вы начинаете с begin() и end() из двух отдельных копий mappa, поскольку getList() возвращает значение вместо ссылки. Вам нужно изменить функцию getList() для возврата по ссылке.

код, который работает, как ожидалось:

#include <iostream> 
#include <string> 
#include <map> 

using namespace std; 

map<string,int> mappa; 

std::map<string,int>& getList() { // returning reference now 
    return mappa; 
} 

int main(int argc, char** argv) { 
    mappa["b"]=1; 
    mappa["a"]=2; 
    for(std::map<string,int>::iterator it=getList().begin();it!=getList().end();++it) 
    { 
    cout<<it->first<<"\n"; 
    } 
    return 0; 
} 
+0

ok но ... почему? У меня есть две копии одной и той же карты ... begin() и end() не возвращают одно и то же значение в обеих копиях? – volperossa

1

getList() возвращает копию mappa. Вы должны изменить его, чтобы вернуть ссылку:

std::map<string,int>& getList() 

или даже лучше константную ссылку:

const std::map<string,int>& getList() 

В последнем случае вам нужно будет использовать const_iterator перебрать карте.

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