map检查map是否被分配了非默认值

std::map check if a map has been assigned a non-default value?

本文关键字:map 默认值 检查 是否 分配      更新时间:2023-10-16

假设我有一个复杂的映射,定义为

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

看起来你使用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]更短,但你正在创造一个问题,试图解决复杂的方式。

现在我如何检查是否显式地向映射添加了值?例如,在这个例子中,我怎么说我没有显式地填充比如complex_map[0]?

如果"显式"的意思是你想找到在执行complex_map[k]=complex_map_child;的初始化循环之后写入的元素,那么:

  • 您可以将地图中的值与complex_map_child进行比较,看看它们是否相等

  • 你可以检测如果一个地图条目被写入相同的值,或改变然后恢复(除非你改变数据类型跟踪自己,或添加一些额外的簿记以外的map自己)