2012-04-20 35 views
3

我在程序中使用C++ STL Map和Vector類,一個向量作爲指向一個整數的鍵。正常情況下,當通過地圖搜索值時,如果未找到該值,myMap.find()將返回myMap.end()。使用std :: vector作爲std :: map的關鍵字在未找到並使用reserve()時未返回end()

當我嘗試使用myVector.reserve(int)在我的向量中預先分配空間(以防止不斷調整大小,因爲我使用它們)時,我遇到了麻煩。出於某種原因,無論我是否實際填充矢量(例1),在我搜索的矢量有空間分配時,在我的地圖中搜索我知道不存在的矢量不會返回myMap.end()。

然而,簡單地插入對象到我希望搜索的向量中時,如果向量不在映射中(例2),會給我適當的myMap.end()位置。

實施例1:

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

using namespace std; 

int main(){ 

vector<int> v, v1; 
v.reserve(1); 
v1.reserve(1); 
v[0] = 1; 
v1[0] = 2; 
map<vector <int>, int> m; 

m.insert(make_pair(v, 0)); 

cout << int(m.find(v1) == m.end()); 
} 

返回0

實施例2:

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

using namespace std; 

int main(){ 

vector<int> v, v1; 
v.reserve(1); 
v[0] = 1; 
v1.push_back(5); 
map<vector <int>, int> m; 

m.insert(make_pair(v, 0)); 

cout << int(m.find(v1) == m.end()); 
} 

返回1

我希望能夠保留的量ö f空間在我的向量中,但似乎只有這樣才能使地圖正常工作,如圖所示,動態插入元素並動態調整矢量大小。它是否正確?有沒有解決方法?任何人都可以提供這個(明顯)aberrant行爲的解釋嗎?

+1

'v [0] = 1;'和'v1 [0] = 2;導致未定義的行爲 - 這兩個vector <>仍然是空的。 – ildjarn 2012-04-20 22:18:39

+3

'reserve'和'resize'是兩個完全不同的東西。您可能意味着'調整大小(1)' – Cornstalks 2012-04-20 22:22:39

+0

@Cornstalks - 我確實相信reserve()是我想要調用的函數,但是在將其更改爲調整大小()時,所有的工作都像我所希望的那樣工作。絕對做得好! cplusplus.com提供了一個非常複雜的解釋調整大小和儲備之間的區別,是否有人有...重新安排? – 2012-04-20 22:29:12

回答

4

首先,這段代碼沒有做到你認爲的那樣。 reserve()不調整大小()。

vector<int> v; 
v.reserve(100); 
v[0] = 1; //undefined 
cout << v.size(); //prints 0 

還有一個編輯:我意識到這其實是因爲在第一種情況下的「預期」的行爲,V和V1是空載體,因爲儲備確實影響==,< =的語義,等等。一旦你瞭解到儲備實際上沒有做任何事情,只是把段錯誤變成混亂的行爲,這應該是有道理的。我會建議不要使用儲備,直到你證明它使性能差異(過早優化)。

我對< = and =>的描述和你可能不需要的地圖在這裏,但留在這裏作爲參考,因爲它可能會影響你在這個問題上的工作。其次,地圖並不關心事物是否==。他們關心的是事情是否在兩個方向上都是< =這個詞是「等價的」。例如

Foo foo1(1); 
Foo foo2(2); 

map<Foo, int> m; 
m.insert(makepair(foo1, 1)); 
m.find(foo2) == m.end(); //will be true iff foo1 <= foo2 && foo2 <= foo1 
//even if foo1 != foo2 or !(foo1 == foo2) 

因此,如果在某些類Foo,如果(foo1 < = foo2的& & foo2的< = foo1)然後somemap.insert(makepair(foo1,1));即使foo1!= foo2或!(foo1 == foo2),somemap.find(foo2)也會找到foo1。

其次,你的< =運算符的向量是什麼?它不是測試具有相同的大小和逐點==。我認爲每個向量都是「等價的」,意思是在兩個方向上,向空向量,但我不確定 - 在任何情況下都要考慮這種行爲,因爲這是問題所在。

+0

運算符<'是以有用的方式爲矢量定義的。這相當於'lexicographical_compare'。 – 2012-04-21 00:16:07

相關問題