2013-05-31 39 views
1

我無法理解以下行爲。當我使用currPMap修改該值時,實際位置處的值不會被修改。爲什麼。別名未使用修改STL容器的實際內容

我檢查了參考operator[]at()返回引用,所以這應該工作。

#include <iostream> 
#include <vector> 
#include <map> 

using namespace std; 

typedef map<int, int> intMap; 
typedef map<int, int>::iterator mapIt; 

int main(void) { 
    vector< map<int, intMap > > b(2); 
    int curr=0, next=1; 
    map<int, intMap> currPMap = b.at(curr); 
    (currPMap[4])[2] = 3; //modified by currPMap. 
    cout<<((b.at(curr))[4])[2]<<endl; 
    ((b.at(curr))[4])[2] = 3; //modified using the actual vector. 
    cout<<((b.at(curr))[4])[2]<<endl; 
} 

輸出:

0 
3 

P.S:我知道我在做什麼在這裏可以通過此設置許多其他的方式來實現,但這並不是實際的程序。這只是我面對我的代碼的問題的明確版本。如果有人回答這種方法有什麼問題,我將不勝感激。

回答

2
map<int, intMap> currPMap = b.at(curr); 

這不是一個別名(又名參考);這是一個副本。如果你想的基準,則需要正是如此聲明它:

map<int, intMap> & currPMap = b.at(curr); 
       ^

請注意,如果添加或刪除元素到載體中,因爲載體需要移動它們的元素,以保持一個連續數組的引用可以被無效。

5

因爲你在這裏得到一個地圖的副本,不是別名

map<int, intMap> currPMap = b.at(curr); // currMap is a copy of b[0] 

然後修改副本,而不是存儲在矢量地圖。

你需要的是一個參考:

map<int, intMap>& currPMap = b.at(curr); // currMap refers to b[0] 
+0

本網站說,在返回參考。 http://www.cplusplus.com/reference/map/map/at/ –

+0

@AmanDeepGautam正是這樣,這就是爲什麼您可以將返回值分配給引用。但你正在複製。 – juanchopanza

+0

我在這裏有點困惑。那麼爲什麼編譯器沒有顯示我所做的任何錯誤/警告消息。這是對的嗎。如果是,那麼怎麼做。(對評論中的問題抱歉) –