我有一个我想要放入地图的值类型.它有一个很好的默认复制构造函数,但没有默认的构造函数.
我相信只要我远离使用operator[],一切都会好的.
但是我最终得到了像这样的非常丑陋的结构来实际插入一个对象.(我认为如果已经存在该键的值,则插入失败).
// equivalent to m[5]=x but without default construction
std::map<int,X>::iterator it = m.find(5);
if( it != m.end() )
{
m->second = x;
}
else
{
m->insert( std::make_pair(5,x) );
}
Run Code Online (Sandbox Code Playgroud)
我相信它会扫描地图两次,看起来也很难看.
是否有更简洁/更有效的方法来做到这一点?
您可以使用标准函数简单地“插入或覆盖” insert:
auto p = mymap.insert(std::make_pair(key, new_value));
if (!p.second) p.first->second = new_value; // overwrite value if key already exists
Run Code Online (Sandbox Code Playgroud)
如果您想通过引用传递元素,请使该对明确:
insert(std::pair<K&, V&>(key, value));
Run Code Online (Sandbox Code Playgroud)
如果您有地图的 typedef,例如map_t,您可以说std::pair<map_t::key_type &, map_t::mapped_type &>,或此主题的任何合适的变体。
也许最好将其包装到一个助手中:
template <typename Map>
void insert_forcefully(Map & m,
typename Map::key_type const & key,
typename Map::mapped_type const & value)
{
std::pair<typename Map::iterator, bool> p = m.insert(std::pair<typename Map::key_type const &, typename Map::mapped_type const &>(key, value));
if (!p.second) { p.first->second = value; }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
651 次 |
| 最近记录: |