std :: map检查是否为地图分配了非默认值?

时间:2015-07-23 16:33:46

标签: c++ std stdmap

让我说我有一个复杂的地图定义为

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]?

2 个答案:

答案 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]的时间较短,但是您正在创建一个试图解决这种错综复杂方式的问题。