I have a std::vector with element of the type std::pair. With some algorithm, I return two iterators (range) so I would like to pick up all elements within that range and copy t
It's because of the operator precedence. The select operator .
has higher precedence than the dereference operator *
.
So what the compiler thinks you're writing is
*(it1.first)
when you mean
(*it1).first
If you are after an algorithm to do this for you, you can use the four parameter overload of 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;});
If you don't have C++11 support, you can use a function instead of the lambda expression:
double foo(const std::pair<double, int>& p) { return p.first; }
std::transform(it1,
it2,
std::back_inserter(data2),
foo);