stl::map 插入一个带有约束的值

stl::map insert a value with a constraint

本文关键字:约束 一个 插入 map stl      更新时间:2023-10-16

我正在使用stl::map来存储一些带有值的键。对于我的应用程序,仅当当前值大于前一个值时,我才需要更改键的值。为此,我打电话给find() 搜索键是否已经在映射中,从而更改其值,否则我调用 insert() 来存储新键。有没有办法以有效的方式做这种事情?还是只调用带有值自定义约束的 insert()

如下所述,std::map 上的一个插入重载返回一对,其中包含节点迭代器和布尔值。布尔值告诉您插入是否成功,或者是否存在欺骗。如果为 false,则只需使用迭代器手动更新值。

#include <iostream>
#include <string>
#include <map>
int main()
{
  typedef std::map<std::string, int> TestMap;
  TestMap test;
  test.insert(std::make_pair("one", 1));
  std::pair<TestMap::iterator, bool> result =
      test.insert(std::make_pair("one", 2));
  if (!result.second)
  {
    // was a duplicate, so let's manually set the value on the existing
    // map entry
    result.first->second = 2;
  }
  std::cout << test.at("one") << std::endl; // outputs 2
}
如果

新值T newval大于或等于前一个T oldval并且仅使用大于或等于T()的值,则应更新映射,则非常简单:

myMap[key] = std::max(myMap[key],newval);

std::map::operator[]将返回对map中元素的引用,该元素要么是已经存在的元素,要么是新的默认构造元素(myMap[key] == T() )。

请注意,此解决方案在后台使用std::map::insert,但如果仅使用非负值,则更容易阅读。

调用 lower_bound 以搜索元素。如果它不存在,它将为您提供下一个更大的密钥。如果键不存在,请使用迭代器后退一步,然后您可以使用提供的参数position调用insert,从而减少搜索要插入的正确位置的时间(可能几乎为零,因为您提供了正确的位置并且map已排序)

http://www.cplusplus.com/reference/stl/map/insert/