C ++ map,查找元素并将其插入另一个地图(不复制)

时间:2014-12-19 10:42:09

标签: c++ stl

如何从源地图中正确查找元素并将其插入另一个地图?

std::map<int, std::shared_prt<Obj>> src_map
std::map<int, std::shared_prt<Obj>> target_map

int key = 6;
auto found_elem = src_map.find(key);

if (found_elem != src_map.end()) {
  if (target_map.find(key) == target_map.end()) {
     target_map.insert(found_elem ); <---- How to correctly insert found element from src_map to target_map
  }
}

2 个答案:

答案 0 :(得分:5)

  target_map.insert(found_elem);

found_elem是一个迭代器,你需要插入它引用的值:

  target_map.insert(*found_elem);

这也可以更有效地完成:

  if (target_map.find(key) == target_map.end()) {
     target_map.insert(found_elem);
  }

您执行两次查找。进入find并再次进入insert

尝试插入它会更好,如果你需要知道它是否插入,请检查返回值:

  auto inserted = target_map.insert(*found_elem);
  // inserted.first is the iterator to the element with the desired key
  // inserted.second is true if a new element was inserted, false if the key already existed

将其放入地图的其他选项是找到它所属的位置,然后在该位置插入(如果它已经不存在):

auto lower = target_map.lower_bound(key);
if (lower == target_map.end() || lower->first != key) {
  target_map.insert(lower, *found_elem);
}

另一种选择是:

auto& val = target_map[found_elem->first];
if (!val)
  val = found_elem->second;

但这并不完全相同,因为如果地图中已存在一个空shared_ptr作为值,那么该值将被替换。取决于您是否可以在地图中使用可能不适合您的程序的空shared_ptr对象。

另一个意思略有不同的是:

target_map[found_elem->first] = found_elem->second;

答案 1 :(得分:0)

在当前声明中

std::map<int, Obj> src_map
std::map<int, Obj> target_map

您无法在内存中连接两个地图的Obj实例。您可以从src_map中移除Obj并输入target_map或将声明更改为;

std::map<int, Obj*> src_map
std::map<int, Obj*> target_map

或任何其他指针类型(注释中建议的shared_ptr),如果没有这个,你将永远在内存中有两个独立的对象。