让我说我有一个复杂的地图定义为
std::map<int, std::pair< vector<int>, float> > complex_map;
我们假设我将此地图初始化为
for (int k=0;k<5;k++)
{
std::pair< vector<int>, float> complex_map_child;
complex_map[k]=complex_map_child;
}
接下来,我填充了这张地图的一些条目:
float test_1 = .7888;
vector<int> test_2;
test_2.push_back(1);
test_2.push_back(2);
complex_map[1].first = test_2;
complex_map[1].second = test_1;
因此,对应于complex_map的键值1,我有一对与test_1和test_2对应的值。
现在我该如何检查是否已向地图显式添加了值?即在这个例子中,我怎么说我没有明确填写说complex_map [0]?
答案 0 :(得分:0)
现在我该如何检查是否已向地图显式添加了值?即在这个例子中,我怎么说我没有明确填写说complex_map [0]?
如果“明确地”表示您想要在执行complex_map[k]=complex_map_child;
的初始化循环之后找到您写入的元素,那么:
您可以将地图中的值与complex_map_child
进行比较,看看它们是否相等
您可以不检测是否使用相同的值写入地图条目,或者更改然后还原(除非您将数据类型更改为跟踪自己的数据类型,或添加一些map
以外的额外簿记
答案 1 :(得分:0)
看起来你正在使用std::map::operator[]
不正确并试图重复它 - 你得到这样的对象:
auto &complex_value = complex_map[0];
现在您尝试检查之前是否已将其插入,或者由std::map::operator[]
隐式创建。
只是不要使用std::map::operator[]
来访问元素。仅在需要在地图中设置值时才使用它。
正确的解决方案是使用不同的方法:
// I just want to check if key 0 is there
if( complex_map.count( 0 ) ) {
...
}
// I want to access element by key 0 if it is there
auto it = complex_map.find( 0 );
if( it != complex_map.end() ) {
auto &complex_value = it->second;
...
}
等等。我知道写complex_map[0]
的时间较短,但是您正在创建一个试图解决这种错综复杂方式的问题。