C++ 复制std::map的子集

C++ 复制std::map的子集,c++,C++,我试图以最有效的方式将std::map结构的子集复制到新的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;

我试图以最有效的方式将std::map结构的子集复制到新的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;
}
//示例程序
#包括
#包括
#包括
int main()
{
//构建地图
std::map mymap;
大小_tnum _el=10;
对于(大小i=0;istd::cout second您可以使用映射范围构造函数(c++11):

std::map output\u map{mymap.find(start\u index),mymap.end();
如果您需要旧标准:

std::map<int,int> output_map( mymap.find(start_index), mymap.end() );
映射输出映射(mymap.find(开始索引),mymap.end());

insert也可以工作

insert方法允许您指定如下范围:

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

output_map.insert(range_start, range_end);

如果您希望在选择复制的元素时有更多的灵活性,
copy\u 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::复制(
开始(mymap),
完(我的地图),
插入器(输出映射,开始(输出映射)),
[&start_index](std::pair p){return p.first>=start_index;}
);
将其用于
std::map
(也包括
std::set
)有点棘手,但是
std::inserter
工作得很好

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

或c++14(范围构造函数)?
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; }
);