Я хотел получить вектор расстояний между соседними точками в векторе:
struct Point { double x, y, z; }
vector<double> adjacent_distances( vector<Point> points ) {
...
}
Я думал, что stl::adjacent_difference()
мог бы сделать трюк для меня, если бы я просто предоставил функцию, которая находит расстояние между двумя точками:
double point_distance( Point a, Point b ) {
return magnitude(a-b); // implementation details are unimportant
}
Таким образом, я надеялся, что это сработает,
vector<double> adjacent_distances( vector<Point> points )
{
vector<double> distances;
std::adjacent_difference( points.begin(), points.end(),
std::back_inserter(distances),
ptr_fun( point_distance ) );
return distances;
}
только чтобы найти, что векторы input
и output
должны были быть (практически) одного и того же типа, потому что adjacent_difference()
вызывает
output[0] = input[0]; // forces input and output to be of same value_type
output[1] = op( input[1], input[0] );
output[2] = op( input[2], input[1] );
....
что, к сожалению, несовместимо с тем, как работает std::adjacent_find()
.
Итак, мне пришлось преобразовать свой код в
double magnitude( Point pt );
Point difference( Point a, Point b ); // implements b-a
vector<double> adjacent_distances( vector<Point> points )
{
vector<Point> differences;
std::adjacent_difference( points.begin(), points.end(),
std::back_inserter(differences),
ptr_fun( point_difference ) );
vector<double> distances;
std::transform( differences.begin(), differences.end(),
std::back_inserter(distances),
ptr_fun( magnitude ) );
return distances;
}
NB: первый элемент differences
должен был быть удален, чтобы функция корректно работала, но я кратко пропустил детали реализации. Кратко.
Вопрос: есть способ, которым я мог бы выполнить некоторое преобразование неявно, так что мне не нужно создавать дополнительный вектор и получить вызов adjacent_difference()
с помощью input_iterator
и output_iterator
разных value_types
?