C++ STL map - 条件插入

Dav*_*rtz 4 c++ stl map

我正在寻找一种有效的方法来进行条件插入.理想情况下,我想要一个适用于任何地图的模板功能.我想要这样的东西:

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
}
Run Code Online (Sandbox Code Playgroud)

我不能轻易使用,operator[]因为没有简单的方法来判断它是否创建了一个元素.我可以count用于测试,但是如果我们进行插入,我必须搜索两次地图.我觉得有些东西find会是最好的,但它似乎似乎总是吵得很尴尬.

有没有一个非常好的方法来做到这一点?

Naw*_*waz 5

你对此有什么问题:

auto ret = MyMap.insert(std::make_pair(3, "Hello"));

if( ret.second)
{ 
    //the value is inserted
}
else
{
    //no value is inserted
}
Run Code Online (Sandbox Code Playgroud)

返回值指示值是否已存在.如果不存在,则插入值,否则不插入任何值.

取自这里:

...返回一对,其成员对:: first设置为迭代器,指向新插入的元素或指向已在地图中具有相同值的元素.如果插入新元素,则对中的pair :: second元素设置为true;如果存在具有相同值的元素,则设置为false.


Fil*_*efp 5

不要覆盖以前的值,使用什么?

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;
Run Code Online (Sandbox Code Playgroud)

输出:

  hello world
Run Code Online (Sandbox Code Playgroud)

是否插入了新值?

std::map<T1,T2>::insert返回a 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
Run Code Online (Sandbox Code Playgroud)

示例代码段:

  std::cerr << m.insert (std::make_pair (1,1)).second << std::endl;
  std::cerr << m.insert (std::make_pair (1,2)).second << std::endl;
Run Code Online (Sandbox Code Playgroud)

产量

  1
  0
Run Code Online (Sandbox Code Playgroud)