1

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

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 算法可以做到这一点。由于数据量非常大,并且上述操作会重复多次,因此使用循环非常慢。

4

2 回答 2

4

如果您正在使用一种算法来为您执行此操作,则可以使用以下四个参数重载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);
于 2013-07-28T19:19:32.223 回答
0

这是因为运算符优先级。选择运算符.的优先级高于取消引用运算符*

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

*(it1.first)

当你的意思是

(*it1).first
于 2013-07-28T18:54:16.493 回答