C++ 映射插入带有约束的值

C++ 映射插入带有约束的值,c++,stl,map,C++,Stl,Map,我使用一个stl::map来存储一些带有值的键。对于我的应用程序,只有当当前值大于上一个值时,我才需要更改键的值。要做到这一点,我打电话 find()搜索键是否已在映射中,从而更改其值,否则调用insert()存储新键。有没有一种有效的方法来做这类事情?或者只调用对值具有自定义约束的insert()。调用下限来搜索元素。如果它不存在,它将为您提供下一个更大的密钥。如果该键不存在,请使用迭代器返回一步,然后可以调用insert,并提供参数position,这将缩短搜索要插入的正确位置的时间(可能几

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

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


如下所示,std::map上的一个insert重载返回一对,其中包含节点的迭代器和bool。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
}
#包括
#包括
#包括
int main()
{
typedef std::map TestMap;
测试图测试;
测试插入(标准:制作一对(“一”,1));
std::配对结果=
测试插入(标准:制作一对(“一”,2));
如果(!result.second)
{
//是重复的,所以让我们手动设置现有
//地图条目
结果:第一->第二=2;
}

std::cout如果新值
T newval
大于或等于先前的
T oldval
并且您只使用大于或等于
T()
的值,则应更新映射。这非常简单:

myMap[key] = std::max(myMap[key],newval);
将返回对映射中某个元素的引用,该元素既可以是现有元素,也可以是新的默认构造元素(myMap[key]=
T()


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

显示一些代码,以便我了解您试图执行的操作。因此,基本上您希望执行类似
myMap[key]=std::max(myMap[key],new_value)的操作
?@Zeta是的,但前提是密钥已经存储在地图中。谢谢,我认为这是最好的策略!在更改之前,我只需对以前的值进行检查,但这正是我想要的。谢谢你的评论!我认为特洛伊的策略更好,因为我只需调用一次insert()。谢谢,这似乎是一个很好的策略,也许从效率的角度来看与特洛伊的策略类似。@user1633717:两种解决方案的复杂性/效率应该是相同的。
if
隐藏在
std::max
中,而
insert
隐藏在
myMap[key]的调用中
insert
的复杂度为O(logn),重要的是缺少的
find
调用,也就是O(logn)。好吧,你必须搜索
键两次,所以效率不高。@JohnB:编译器没有优化
操作符[]的调用吗
?否则,您可以只使用
value\u type&myelement=myMap[key];myelement=std::max(myelement,newval);
如果找不到键,这会做什么?