有没有办法获得&#34; .first&#34;的连续记忆?和&#34; .second&#34; vector<pair<double,double>>
的?我的意思是:
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
。我猜这是不可能的。如果我有一个向量x,那么我当然可以做x.data()和y.data()。
答案 0 :(得分:2)
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)将xy
转换为x
和y
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
的定义更改为x
和y
。
如果您可以更改func
,我建议重构,以便您可以调用内部循环并为迭代器(或范围)重写它。通过这种方式,您可以将其与std::pair
s上的投影结合使用。