Я хотел получить вектор расстояний между соседними точками в векторе :
struct Point { double x, y, z; }
vector adjacent_distances( vector points ) {
...
}
Я думал, что stl :: neighbour_difference ()
поможет мне, если я просто предоставлю функцию, которая находит расстояние между двумя точками:
double point_distance( Point a, Point b ) {
return magnitude(a-b); // implementation details are unimportant
}
Таким образом, я надеялся, что это поможет работают
vector adjacent_distances( vector points )
{
vector distances;
std::adjacent_difference( points.begin(), points.end(),
std::back_inserter(distances),
ptr_fun( point_distance ) );
return distances;
}
только для того, чтобы обнаружить, что входные
и выходные
векторы должны быть (практически) одного и того же типа, потому что neighbour_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 :: neighbour_find ()
.
Итак, мне пришлось преобразовать свой код в
double magnitude( Point pt );
Point difference( Point a, Point b ); // implements b-a
vector adjacent_distances( vector points )
{
vector differences;
std::adjacent_difference( points.begin(), points.end(),
std::back_inserter(differences),
ptr_fun( point_difference ) );
vector distances;
std::transform( differences.begin(), differences.end(),
std::back_inserter(distances),
ptr_fun( magnitude ) );
return distances;
}
NB : первый элемент различий
должен был быть удален, чтобы функция работала правильно, но я пропустил детали реализации, так как краткость.
Вопрос: есть ли способ неявного выполнения некоторого преобразования, чтобы мне не приходилось создавать дополнительный вектор и вызывать neighbour_difference ()
с помощью input_iterator
и output_iterator
разных value_types
?