如何将向量中的第一个元素复制到另一个向量?

时间:2013-07-28 18:51:05

标签: c++ stl iterator

我有一个std :: vector,其元素类型为std :: pair。使用一些算法,我返回两个迭代器(范围),所以我想获取该范围内的所有元素并将该对的第一个条目复制到另一个向量

std::vector< pair<double, int> > data;
std::vector<double> data2;
std::vector< pair<double, int> >::iterator it1, it2;

for (;it1!=it2; it1++)
{
  data2.push_back(it1->first);
}

使用循环会这样做,但我想知道是否有一个简单的stl算法来做到这一点。由于数据大小如果相当大且上面的操作将重复多次,使用循环非常慢。

2 个答案:

答案 0 :(得分:3)

如果您正在使用算法为您执行此操作,则可以使用std::transform的四参数重载:

#include <algorithm> // for transform
#include <iterator>  // for back_inserted and distance

....
std::vector< pair<double, int> > data;
std::vector<double> data2;
data2.reserve(std::distance(it1, it2));
std::transform(it1, 
               it2, 
               std::back_inserter(data2), 
               [](const std::pair<double, int>& p){return p.first;});

如果您没有C ++ 11支持,则可以使用函数而不是lambda表达式:

double foo(const std::pair<double, int>& p) { return p.first; }

std::transform(it1, 
               it2, 
               std::back_inserter(data2),
               foo);

答案 1 :(得分:0)

这是因为operator precedence。选择运算符.的优先级高于解除引用运算符*

编译器认为你写的是

*(it1.first)

当你的意思

(*it1).first