簡體   English   中英

使用std :: vector作為std :: map的鍵不會在找不到時使用reserve()返回end()

[英]Using std::vector as a key for std::map does not return end() when not found and using reserve()

我在一個程序中使用c ++ STL Map和Vector類,我有一個地圖,它將一個向量作為指向整數的鍵。 通常,當在地圖中搜索值時,如果找不到該值,myMap.find()將返回myMap.end()。

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

但是,當向量不在地圖中時,簡單地將對象插入到我想要搜索的向量中將為我提供正確的myMap.end()位置(示例2)。

例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

我希望能夠在我的向量中保留一定量的空間,但似乎讓地圖如圖所示工作的唯一方法是動態插入元素並動態調整向量的大小。 它是否正確? 有沒有解決方法? 任何人都能解釋這種(明顯的) aberrant行為嗎?

首先,這段代碼不符合你的想法。 reserve()不會調整大小()。

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

還有一個編輯:我意識到這其實是“預期”的行為,因為在第一種情況下,V和V1是空載體,因為儲備影響==的語義,<=,等等。一旦你明白儲備是有效的除了將段錯誤變成令人困惑的行為之外別無所求,這應該是有道理的。 我建議不要使用保留,直到你證明它會產生性能差異(過早優化)。

我對<=和=>和地圖的描述你可能不需要這里,但留待參考,因為它可能會影響你對這個問題的工作。

其次,地圖不關心事物是否==。 他們關心事物是否在兩個方向上都是<= - 這個詞是“等同的”。 例如

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中,if(foo1 <= foo2 && foo2 <= foo1)則somemap.insert(makepair(foo1,1)); somemap.find(foo2)即使foo1!= foo2或!(foo1 == foo2)也會找到foo1。

其次,你對載體上的<=運算符是什么? 它沒有測試具有相同的大小和逐點==。 我認為每個向量都是“等價的”,意思是<=在兩個方向上,對於空向量,但我不確定 - 無論如何都要考慮這種行為,因為這就是問題所在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM