2014-01-24 32 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作爲輸出迭代器。

相關問題