2013-01-13 63 views
2

我有一個的std ::地圖結構問題: 這段代碼正常工作: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循環中,您將從2個獨立的mappa副本中獲取begin()和end(),因爲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

確定但是...爲什麼?我有兩個相同的地圖副本... begin()和end()不會在兩個副本中返回相同的值? – volperossa

1

getList()返回一個mappa的副本。你需要改變它返回一個參考:

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

甚至更​​好const引用:

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

在您需要使用常量性迭代地圖在後一種情況下。