2017-02-17 30 views
1

vector<pair<double,double>>の ".first"と ".second"の連続したメモリを取得する方法はありますか?私は何を意味することである:上記の機能についてはC++ベクトルを変換する<pair <double、double >> to 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

この機能をベクターにそのまま適用するように変更しましたか?そうでない場合は、配列全体を繰り返し処理し、新しいベクターを塗りつぶす必要があります。あるいは、最初の/ 2番目に反復する 'vector >'のための独自のイテレータを書くこともできます。 – user463035818

+0

あなたはこのような意味を持っていますか? 'vec [0]'は要素0へのポインタを取得します。しかし、ベクトルの内部に一対がある場合でも 'vec [0] .first'または' vec [0 ]秒。 – Aeonos

+0

btwペアは連続したメモリにありますが、x(とy)は – user463035818

答えて

2

std::vector<std::pair<double, double>> xystd::vector<double> x,yのメモリレイアウトが異なります。 funcが変更できないサードパーティのライブラリの一部である場合、あなたは

a)の迅速な汚い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を変換funcを呼び出す

にバインドされています xy

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へ)単にxとにxyのdefintionsを変更します210。

funcを変更できる場合は、内部ループを呼び出してイテレータ(または範囲)に書き換えることができるようにリファクタリングすることを提案します。そうすれば、std::pairの投影でそれを使うことができます。

Here is the full source code.

+0

aha、興味深いことに、この特定の関数はyの値を変更するために複数のインデックスを加算する必要があるため、Aは機能しません(ラ・コンボリューション)。したがって、 'xとyのペア 'ではなく、' separate x and y'を使うか、関数を変更するだけです。 –

+0

私はベクトルを別のものに変換するためのソースコードを追加しました。ベクトルが大きい場合は注意が必要です。 'std :: make_pair'呼び出しで余分な割り当てとコピーについてはわかりません。 – Maikel

関連する問題