неявное преобразование при вызове std :: neighbour_difference ()

Я хотел получить вектор расстояний между соседними точками в векторе :

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 ?

10
задан Grim Fandango 25 November 2011 в 10:36
поделиться