【问题标题】:How can I copy one map into another using std::copy?如何使用 std::copy 将一张地图复制到另一张地图中?
【发布时间】:2011-02-14 10:51:52
【问题描述】:

我想将一个 std::map 的内容复制到另一个。我可以使用std::copy 吗?显然,下面的代码是行不通的:

int main() {
  typedef std::map<int,double> Map;
  Map m1;
  m1[3] = 0.3;
  m1[5] = 0.5;
  Map m2;
  m2[1] = 0.1;
  std::copy(m1.begin(), m1.end(), m2.begin());
  return 0;
}

这不起作用,因为copy 将在m2.begin() 上调用operator* 以“取消引用”它并分配一个值(所有值都是std::pair&lt;const int, double&gt; 类型)。然后它将调用operator++ 移动到m2 中的下一个空间。这两个操作都不起作用,因为const int 中的const 并且没有为任何新元素保留空间。

有没有办法让它与std::copy 一起工作?

谢谢!

【问题讨论】:

    标签: c++ stl map iterator copy


    【解决方案1】:

    更新: C++ 98 引入了 '=' 运算符,它将元素从左侧复制到容器中。 {map& operator= (const map& x);}

    C++ 11 添加了移动语义来移动左侧容器中的所有元素 {map& operator= (map&& x);}

    和初始化列表赋值 {map& operator= (initializer_list il); }

    https://www.cplusplus.com/reference/map/map/operator=/

    【讨论】:

      【解决方案2】:

      您可以使用 GMan 的答案 --- 但问题是,为什么您要使用 std::copy?您应该改用成员函数std::map&lt;k, v&gt;::insert

      m2.insert(m1.begin(), m1.end());
      

      【讨论】:

      • 好吧,如果你要避免使用std::copy,为什么不直接使用copy c'tor呢? m2 = m1。编辑:啊,他想要价值观的结合。
      • @Stephen:因为使用insert 会保留m2 中的现有内容。使用复制 assignment 运算符会破坏 m2 中的现有内容。
      • @Billy:你的答案显然是 OP 的正确答案,但为什么我可以使用 copy_if 的答案,并在复制过程中过滤一张地图到另一张地图。
      • @Cheshire copy_if != copy.
      • 愚蠢的问题,但为什么不直接做Map m2 = m1;
      【解决方案3】:

      您需要insert iterator 的变体:

      std::copy(m1.begin(), m1.end(), std::inserter(m2, m2.end()) );
      

      inserter&lt;iterator&gt; 中定义。它需要一个插入位置(因此是m2.end()),并返回一个insert_iterator

      【讨论】:

      • +1 表示正确答案,但应该更喜欢成员函数而不是算法调用。
      • +1 @GMan,+1 @Billy,你们都做对了。 OP 应该按照比利的建议去做,但 GMan 实际上回答了这个问题。所以,结合你的力量......
      • @WilhelmTell:我是地球队长!
      • 这个版本在使用 c++11 的 copy_if 变体时效果很好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      相关资源
      最近更新 更多