2016-08-22 91 views
3

我想以最有效的方式将一个std :: map结构的一个子集复制到一个新的地图结构中。我只能认为这样一个普通的解决方案:复制一个std :: map的子集

// Example program 
#include <iostream> 
#include <string> 
#include <map> 

int main() 
{ 
    // build map 
    std::map<int, int> mymap; 
    size_t num_el = 10; 


    for(size_t i = 0; i < num_el; ++i) 
    { 
     mymap.insert(std::pair<int,int>(i,i)); 
    } 

// copy submap 
int start_index = 5; 
std::map<int,int> output_map; 
std::map<int,int>::const_iterator it; 

    for(it = mymap.find(start_index); it != mymap.end(); ++it) 
    { 
     output_map.insert(*it); 
    } 


    //print result 
    std::map<int,int>::const_iterator pit; 
    for(pit = output_map.begin(); pit != output_map.end(); ++pit) 
    { 
    std::cout << pit->second << " , "; 
    } 

    std::cout << std::endl; 
} 

有没有更好的方式来做到这一点?

回答

2

插入方法允许你可以这样指定一个范围:

auto range_start = mymap.find(5); 
auto range_end = mymap.end(); 

output_map.insert(range_start, range_end); 
1

您可以使用地图范围的构造函数(C++ 11):

std::map<int,int> output_map{mymap.find(start_index), mymap.end()}; 

,如果你需要旧标准:

std::map<int,int> output_map(mymap.find(start_index), mymap.end()); 

,并插入工作太

+0

或C++ 14(范围构造函数)? – isnullxbh

1

如果你想在复制的元素选择额外的灵活性,copy_if将提供它:

std::copy_if(
    begin(mymap), 
    end(mymap), 
    std::inserter(output_map, begin(output_map)), 
    [&start_index](std::pair<int,int> p) { return p.first >= start_index; } 
); 

这是一个有点棘手,用它来std::map(也如std::set),但std::inserter很好地工作。

当然,更简单的std::copy可以使用类似的范围构造函数。