gpt4 book ai didi

c++ 将 vector> 转换为 double*, double*?

转载 作者:行者123 更新时间:2023-11-30 03:34:07 30 4
gpt4 key购买 nike

有没有办法获取vector<pair<double,double>> 的“.first”和“.second”的连续内存? ?我的意思是:

void func(int N, double* x, double* y)
{
for (int i = 0; i < N; ++i)
//do something to x[i] and y[i]
}

对于上述功能,我有一个 vector<pair<double,double>> point而不是 vector<double> x, y .我猜这是不可能的。如果我有一个 vector x,y 那么我当然可以做 x.data() 和 y.data()。

最佳答案

std::vector<std::pair<double, double>> xy 的内存布局和 std::vector<double> x,y是不同的。如果func是您无法更改的第三方库的一部分,您必须

a) 调用 func几次 N=1或(快速变脏)

auto xy = std::vector<std::pair<double, double>> {
{0,0}, {42,0}, {0, 42}, {42, 42}
};
for (auto& [x,y] : xy) { // or for (auto& p : xy) func(1, p.first, p.second)
func(1, &x, &y);
}

b) 转换 xyxy

template <typename T, typename S>
auto convert(const std::vector<std::pair<T,S>>& xy)
{
auto xs = std::vector<T>{};
auto ys = std::vector<S>{};
xs.reserve(xy.size());
ys.reserve(xy.size());
for (auto& [x,y] : xy) {
xs.push_back(x);
ys.push_back(y);
}
return std::make_pair(xs, ys);
}

int main()
{
auto xy = std::vector<std::pair<double, double>> {
{0,0}, {42,0}, {0, 42}, {42, 42}
};
auto [x, y] = convert(xy);
func(xy.size(), x.data(), y.data());
}

c) 只需更改 xy 的定义即可至 xy .

如果你能改变func ,我建议进行重构,以便您可以调用内部循环并为迭代器(或范围)重写它。这样你就可以将它与 std::pair 上的投影一起使用

Here is the full source code.

关于c++ 将 vector<pair<double,double>> 转换为 double*, double*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42296528/

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