gpt4 book ai didi

c++ - 调用 std::adjacent_difference() 时的隐式转换

转载 作者:可可西里 更新时间:2023-11-01 16:05:46 27 4
gpt4 key购买 nike

我想获得 vector 中相邻之间的距离 vector :

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;
}

只是发现 inputoutput vector 必须(实际上)是同一类型,因为 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;
}

注意:必须删除 differences 的第一个元素才能使函数正常运行,但为简洁起见,我跳过了实现细节。

问题:有没有一种方法可以隐式实现一些转换,这样我就不必创建额外的 vector ,并实现对adjacent_difference() 的调用> 使用不同 value_typesinput_iteratoroutput_iterator

最佳答案

可能这不是那么整洁,在这种特定情况下,std::transform具有 2 个输入序列可能会满足目的。例如:

vector<double> adjacent_distances( vector<Point> points ) {
if ( points.empty() ) return vector<double>();

vector<double> distances(
1, point_distance( *points.begin(), *points.begin() ) );

std::transform( points.begin(), points.end() - 1,
points.begin() + 1,
std::back_inserter(distances),
ptr_fun( point_distance ) );
return distances;
}

希望对你有帮助

关于c++ - 调用 std::adjacent_difference() 时的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8267806/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com