如何检查std :: map键是否存在对象的属性更新,否则插入一个新的?

时间:2015-03-25 15:30:00

标签: c++ dictionary stl

在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,然后更新其属性?

5 个答案:

答案 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

请参阅:http://www.cplusplus.com/reference/map/map/operator[]/

答案 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...
    }