我试图以最有效的方式将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;
}
有更好的方法吗?
答案 0 :(得分:2)
insert方法允许您指定如下范围:
auto range_start = mymap.find(5);
auto range_end = mymap.end();
output_map.insert(range_start, range_end);
答案 1 :(得分: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() );
插入也适用
答案 2 :(得分: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
可以与范围构造函数类似地使用。