2010-04-30 101 views
17

我想将一个std :: map的内容复制到另一个。我可以使用std::copy吗?显然,下面的代码将无法正常工作:如何使用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会调用operator*m2.begin()为“解引用”,并分配一个值(所有值都是std::pair<const int, double>类型)。然后它会呼叫operator++移动到m2的下一个空间。由于const int中的const这两个操作都不起作用,并且没有为任何新元素保留空间。

有什么办法可以使它与std::copy一起工作?

谢谢!

回答

59

您可以使用GMan的答案---但问题是,为什么是否要使用std::copy?您应该使用成员函数std::map<k, v>::insert来代替。

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

+1的确,更清洁。 – GManNickG 2010-05-01 00:04:48

+1

好吧,如果你要避免使用std :: copy,为什么不使用copy c'tor? m2 = m1。编辑:啊,他想要价值的联合。 – Stephen 2010-05-01 00:08:14

+2

@Stephen:因为使用'insert'保留'm2'内的现有内容。使用copy * assignment *操作符会破坏'm2'中的现有内容。 – 2010-05-01 00:09:39

19

你需要一个insert iterator的变体:

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

inserter<iterator>定义。它需要一个地方插入(因此m2.end()),并返回insert_iterator

+5

+1表示正确答案,但应该更喜欢成员函数来算法调用。 – 2010-05-01 00:04:16

+0

+1 @GMan,+1 @比利,你们俩都说得对。 OP应该做比利建议的事情,但GMan事实上回答了这个问题。所以,结合你的能力... – wilhelmtell 2010-05-01 03:43:12

+5

@WilhelmTell:我是一个拥有行星的人! – GManNickG 2010-05-01 07:19:49

相关问题