在java中,我有时会这样做
Map<String, POJO> objmap = new HashMap<String, POJO>();
POJO obj = null;
if ((obj = objMap.get(key)) == null) {
obj = new POJO();
objMap.put(key, obj);
}
obj.setName("something");
obj.setAddress("yeah");
使用std :: map在c ++中执行类似操作的最佳做法是什么? 如果不存在,在地图中创建一个obj,然后更新其属性?
答案 0 :(得分:1)
您想使用insert函数,它返回一个迭代器和一个关于是否插入新对象的布尔值: 像这样的东西:
typedef map<int,void*> M;
M m;
auto insertion = m.insert(M::value_type(0,nullptr));
if (insertion.second) {
insertion.first->second = new... (// allocate your item or whatever, this is the iterator to it)
}
答案 1 :(得分:1)
你可以写objmap[key] = value
。
答案 2 :(得分:1)
像这样:
void insert_or_update(const K & k, const T & t, std::map<K, T> & m)
{
auto p = m.insert(std::make_pair(k, t));
if (!p.second) p.first->second = t;
}
或者:
m[k] = t;
后者要求T
是可默认构造且可分配的。
在C ++ 17中,你也可以说:
m.insert_or_assign(k, t);
这比上面的构造有更少的限制,并返回有关插入是否发生的信息,以及元素的迭代器。
答案 3 :(得分:0)
std::map<std::string, POJO> mapStr2Pojo;
mapStr2Pojo["something"].setName("something");
mapStr2Pojo["something"].setAddress("yeah");
std :: map&lt;&gt;的操作[]如果找不到它,则插入该对象。
答案 4 :(得分:0)
插入操作检查每个插入的元素是否具有等同于容器中已有元素的键,如果是,则不插入元素,将迭代器返回到此现有元素
if ( !myMap.insert( std::make_pair( key, value ) ).second )
{
// Element already present...
}