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

how copy the first elements of pair in vector to another vector?

本文关键字:向量 复制 元素 另一个 第一个      更新时间:2023-10-16

我有一个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算法可以实现这一点。由于数据大小如果相当大及以上的操作将重复多次,因此使用循环的速度相当慢。

如果你正在寻找一种算法来为你做这件事,你可以使用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);

这是因为运算符的优先级。选择运算符.具有比解引用运算符*更高的优先级。

所以编译器认为你在写的是

*(it1.first)

当你指的是

(*it1).first