3

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

4

3 回答 3

4

如下所述,std::map 上的插入重载之一返回包含节点迭代器和布尔值的对。bool 告诉您插入是否成功,或者是否存在欺骗。如果为 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
}
于 2012-10-07T08:34:57.527 回答
2

如果新值T newval大于或等于前一个T oldval值并且您只使用大于或等于T()它的值,则应该更新地图,这真的很简单:

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

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

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

于 2012-10-07T08:52:32.827 回答
-1

调用lower_bound以搜索元素。如果它不存在,它将为您提供下一个更大的密钥。如果键不存在,则使用迭代器返回一步,然后您可以在提供insert参数position的情况下进行调用,这样可以减少搜索要插入的正确位置的时间(可能几乎为零,因为您提供了正确的位置并且map是订购)

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

于 2012-10-07T08:27:25.617 回答