c++ STL映射-条件插入

C++ STL map - conditional insert

本文关键字:条件 插入 映射 STL c++      更新时间:2023-10-16

我正在寻找一种有效的方法来做条件插入。理想情况下,我想要一个模板函数,将工作在任何地图。我想要这样写:

std::map<int, std::string> MyMap;
if(MyMap.ConditionalInsert(3, "Hello"))
{ // there was no element 3, one has been added with value "Hello"
}
else
{ // there was already an element 3 in the map, it's unchanged
}

我不能轻易地使用operator[],因为没有简单的方法来判断它是否创建了一个元素。我可以使用count进行测试,但是如果我们进行插入,我必须搜索映射两次。我想find的东西最好,但它似乎总是出来疣和尴尬。

有真正好的方法来做到这一点吗?

你觉得这有什么问题:

auto ret = MyMap.insert(std::make_pair(3, "Hello"));
if( ret.second)
{ 
    //the value is inserted
}
else
{
    //no value is inserted
}

返回值指示该值是否已经存在。如果不存在,则插入值,否则不插入值。

摘自:

…返回一个pair,其成员pair::first设置为一个迭代器,该迭代器指向新插入的元素或在映射中已经具有相同值的元素。如果插入了新元素,则pair::中的第二个元素设为true;如果存在具有相同值的元素,则设为false。

不覆盖之前的值,用什么?

std::map<T1,T2>::insert已经为您做了这个检查,如果已经有一个带有指定键的条目,则插入将被中止。

  std::map<int, std::string> m;
  m.insert (std::make_pair (3, "hello world"));
  m.insert (std::make_pair (3, "world hello"));
  std::cerr << m[3] << std::endl;
输出:

  hello world

是否插入了新值?

std::map<T1,T2>::insert返回一个std::pair<std::map<T1,T2>::iterator, bool>,第二个值(pair.second)将作为一个标志,表明键/值对是否被插入。

if ret.second ==  true: value was inserted
if ret.second == false: the key has already been set

示例代码片段:

  std::cerr << m.insert (std::make_pair (1,1)).second << std::endl;
  std::cerr << m.insert (std::make_pair (1,2)).second << std::endl;

输出
  1
  0

insert函数已经做了你想要的。

std::pair<std::map<int, std::string>::iterator, bool>
    insertionResult = MyMap.insert(std::make_pair(3, "Hello"));
if(insertionResult.second)
{ // there was no element 3, one has been added with value "Hello"
}
else
{ // there was already an element 3 in the map, it's unchanged
}

第一个元素给出了包含键的元素的位置,无论它是旧的还是新的