整数を指すキーとしてベクトルを取るマップがあるプログラムで、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
この(明らかな)動作について説明できる人はいますか?