我正在使用stl::map来存储一些带有值的键。对于我的应用程序,仅当当前值大于前一个值时,我才需要更改键的值。为此,我调用 find()来搜索键是否已经在映射中并更改它的值,否则我调用insert()来存储新键。有没有办法以有效的方式做这种事情?或者只调用对值有自定义约束的insert() ?
问问题
224 次
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
是订购)
于 2012-10-07T08:27:25.617 回答