2017-02-17 179 views
1

有没有办法获得vector<pair<double,double>>的“.first”和“.second”的连续内存?我的意思是:C++将vector <pair <double,double >>转换为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,y,那么我当然可以做x.data()和y.data()。

+2

不能改变函数来处理矢量,因为它是?如果不是,则必须遍历数组并填充一个新的向量。或者,你可以为'vector >'编写自己的迭代器,分别在第一个/第二个迭代器上进行迭代。 – user463035818

+0

你的意思是这样的:'&vec [0]'得到一个指向元素0的指针。但是如果在向量内有一对,仍然必须执行'vec [0] .first'或'vec [0 ] .second'。 – Aeonos

+0

顺便说一句,这些对是在连续的内存中,但x(和y)不是 – user463035818

回答

2

std::vector<std::pair<double, double>> xystd::vector<double> x,y的存储器布局是不同的。如果func是一个第三方库,你不能改变的一部分,你就一定能

一)调用funcN=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的defintions到xy

如果你可以改变func,我建议重构一下,你可以调用内部循环并为迭代器(或范围)重写它。这样你就可以在std::pair s上使用它。

Here is the full source code.

+0

aha,有趣的是要注意,A不会工作,因为这个特定的函数需要多个索引的总和来改变y的值(一个卷积)。所以看起来唯一的选择是使用'单独的x和y'而不是'x和y'对或者改变函数。 –

+0

我添加了将矢量转换为单独的源代码。如果矢量很大,必须小心。我不知道额外的分配和复制通过'std :: make_pair'调用。 – Maikel

相关问题