我在程序中使用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
行爲的解釋嗎?
'v [0] = 1;'和'v1 [0] = 2;導致未定義的行爲 - 這兩個vector <>仍然是空的。 – ildjarn 2012-04-20 22:18:39
'reserve'和'resize'是兩個完全不同的東西。您可能意味着'調整大小(1)' – Cornstalks 2012-04-20 22:22:39
@Cornstalks - 我確實相信reserve()是我想要調用的函數,但是在將其更改爲調整大小()時,所有的工作都像我所希望的那樣工作。絕對做得好! cplusplus.com提供了一個非常複雜的解釋調整大小和儲備之間的區別,是否有人有...重新安排? – 2012-04-20 22:29:12