2014-01-24 30 views
0

我想将std :: map的前N个元素复制到另一个地图。我试过copy_n但是失败了。我怎样才能做到这一点?如何将std :: map的前N个元素复制到另一个地图?

#include <iostream> 
#include <map> 
#include <algorithm> 
#include <iterator> 
using namespace std; 
int main(){ 
    map<int,int> Map; 
    for (int i=0;i<10;i++) Map[i]=i*i; 
    map<int,int> Map2; 
    std::copy_n(Map.begin(), 5, Map2.end()); 
    return 0; 
} 
+6

即使您认为自己失败了,请在您的问题中发布代码的相关部分。否则,我们无法确定你失败的可能性有多大,如果有的话。 –

+0

你必须发布你的'std :: copy_n'代码,这样我们才能找出为什么它不起作用。它应该有。 –

回答

6

使用copy_n?它的工作原理,因为它应该:

#include <algorithm> 
#include <iterator> 
#include <iostream> 
#include <map> 

int main() { 
    std::map<int, int> m1 { { 1, 2 }, { 2, 9 }, { 3, 6 }, { 4, 100 } }, m2; 
    std::copy_n(m1.begin(), 2, std::inserter(m2, m2.end())); 

    for (auto const & x : m2) 
     std::cout << x.first << " => " << x.second << "\n"; 
} 
+0

这是一个[现场演示](http://ideone.com/Mc7d03)。 –

+0

http://pastebin.com/Z2bwu8d7 这是我的代码。我得到'copy_n没有在范围内声明' – user1159517

+0

@ user1159517你使用什么编译器? – templatetypedef

4

如果你正在构建从零开始其他地图,你可以简单地通过它,它需要构造函数的迭代器:

std::size_t n = ...; 

std::map<K, V> m1 = { ... }; 
std::map<K, V> m2(m1.begin(), std::next(m1.begin(), n)); 
+0

+1,因为它是正确的方式,即使它不是OP的X的Y. –

+0

不错,但是不会将'm1'的片段迭代两次吗? – pmr

+0

@pmr是的,它会的。但是,除非它特别敏感,否则我不会为此担心。 – Yuushi

0

如果你想创建一个新的地图,你可以使用范围构造函数。插入到现有的地图可以使用范围std :: map :: insert来完成。

std :: copy也可以使用,但是你必须使用一个std :: inserter作为输出迭代器。

相关问题