std::vector<std::pair<double, double>> xy
とstd::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
を呼び出す
にバインドされています
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へ)単にx
とにxy
のdefintionsを変更します210。
func
を変更できる場合は、内部ループを呼び出してイテレータ(または範囲)に書き換えることができるようにリファクタリングすることを提案します。そうすれば、std::pair
の投影でそれを使うことができます。
Here is the full source code.
この機能をベクターにそのまま適用するように変更しましたか?そうでない場合は、配列全体を繰り返し処理し、新しいベクターを塗りつぶす必要があります。あるいは、最初の/ 2番目に反復する 'vector>'のための独自のイテレータを書くこともできます。 –
user463035818
あなたはこのような意味を持っていますか? 'vec [0]'は要素0へのポインタを取得します。しかし、ベクトルの内部に一対がある場合でも 'vec [0] .first'または' vec [0 ]秒。 – Aeonos
btwペアは連続したメモリにありますが、x(とy)は – user463035818