私は、C++ STL MapクラスとVectorクラスを使用しています。整数を指すキーとしてのベクトル。通常、値をマップから検索する場合、値が見つからない場合、myMap.find()はmyMap.end()を返します。std :: vectorをstd :: vectorのキーとして使用すると、見つからない場合にend()が返されず、reserve()を使用します。
myVector.reserve(int)を使用して、ベクターでスペースを事前に割り当てようとすると、問題が発生します。何らかの理由で、私がベクトルを実際に埋めているかどうかにかかわらず、私が検索するベクトルにスペースが割り当てられているとmyMap.end()は返されません(例1)。
しかし、私が検索したいベクトルにオブジェクトを挿入するだけで、ベクトルがマップにない場合(例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:私は量Oを確保することができるようにしたい1
#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());
}
戻り値f空間を私のベクトルに入れていますが、地図を表示させるための唯一の方法は、その場で要素を挿入し、ベクトルのサイズを動的に変更することです。これは正しいです?回避策はありますか?誰もこれ(明らか)aberrant
の動作の説明を提供できますか?
'v [0] = 1;'と 'v1 [0] = 2;'は未定義の動作を引き起こします - 両方の 'vector <>'はまだ空です。 – ildjarn
'reserve'と' resize'は2つの非常に異なるものです。あなたはおそらく 'resize(1)'を意味する – Cornstalks
@Cornstalks - 私は実際にreserve()が私が呼んでいたかった機能だと考えましたが、resize()を変更すると、絶対にやった! cplusplus.comは、サイズ変更と予約の違いについて非常に複雑な説明を提供しています。 –