2014-03-25 114 views
0

我有3個數據結構:隊列節點(struct),隊列節點vectormap具有作爲字符串的鍵和指向隊列節點的指針。它們的定義如下:實現結構向量和指針結構的向量


隊列節點:

struct QNode{ 
    int32_t index; 
    int32_t count; 
}; 

矢量:

vector<QNode> n; 

地圖:

map<string, QNode*> QueuePointerMap; 

每當我創建一個節點時,我將它插入向量中,並將指針存儲到剛剛在映射中創建的節點中,並將該鍵作爲唯一字符串存儲。我使用下面的代碼可以這樣做:

n.push_back(QNode());   
int insertIndex = n.size(); 
n[insertIndex-1].index = index-1;  
n[insertIndex-1].count = 1; 
cout << "***************************\n"; 
cout << "Insert index: " << insertIndex << "\n"; 
cout << "n[insertIndex -1].index: " << n[insertIndex -1].index << "\n"; 
cout << "n[insertIndex -1].count: " << n[insertIndex -1].count << "\n";      
cout << "***************************\n"; 
QueuePointerMap[uniqStr] = &(n[insertIndex-1]); 
cout << "Address of N: " << &(n[insertIndex-1]) << "\n\n"; 

每當我在載體中插入一個節點,它被正確地存儲在載體和地圖,我插入一個新的節點之後面臨的一個問題。每當我在矢量(和地圖)中插入一個新值,並且如果我嘗試獲取以前的值,我會得到與存儲的值不同的值。我用我的檢索值,下面的代碼:

map<string, QNode*>::iterator it1; 
it1=QueuePointerMap.find(uniqStr); 
if(it1 == QueuePointerMap.end()){ 
    cout << "\n Not Found \n"; 
} 
else{ 
    QNode * n1 = it1->second; 
    cout << "Value of N1: " << n1 ; 
    cout << "\t Index: "<< (n1->index) << "\n Count: " << (n1->count) << "\n"; 
} 

我不明白爲什麼我收到了指數的不同的價值觀和計數。我想我在插入時做了一些錯誤,但我無法弄清楚問題所在。我真的很感激,如果有人幫助我理解並解決這個問題。謝謝。

+0

在將'uniqstr'值設置爲'QueuePointerMap'的關鍵字之前設置的位置/何時? –

+0

我從用戶那裏得到它,並確保它的獨特性。如果不是,則上述操作不會發生。 – TheRookierLearner

+0

嘗試使用調試器緩慢地將指針值存儲在另一個結構中和/或逐步緩存,並跟蹤指針值和QNode struct內部結構。請記住,矢量的[]運算符返回對該位置元素的引用。 [std :: vector :: operator \ [\]](http://en.cppreference.com/w/cpp/container/vector/operator_at) –

回答

1

每當你在向量中插入一個新值時,向量可能會或可能不會重新組織它的內部結構(將對象重新定位到不同的內存位置等等),所以你從向量的元素獲得的舊指針可能會會或可能不會是無效的......

http://www.cplusplus.com/reference/vector/vector/push_back/說:

如果發生了重新分配,涉及到容器內的所有迭代器,指針和引用無效。

+0

好的。無論如何保留原始值/指針? – TheRookierLearner

+0

你可以映射到索引...地圖 QueueIndexMap; – fritzone

+1

@ TheRookierLearner,如果你知道預先放入向量中的數值(N),你可以調用'vector.reserve(N)'。那麼在超過這個數字之前它不會被調整大小。 – user2079303