std::vector<std::pair<double, double>> xy
和std::vector<double> x,y
的存储器布局是不同的。如果func
是一个第三方库,你不能改变的一部分,你就一定能
一)调用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
的defintions到x
和y
。
如果你可以改变func
,我建议重构一下,你可以调用内部循环并为迭代器(或范围)重写它。这样你就可以在std::pair
s上使用它。
Here is the full source code.
不能改变函数来处理矢量,因为它是?如果不是,则必须遍历数组并填充一个新的向量。或者,你可以为'vector>'编写自己的迭代器,分别在第一个/第二个迭代器上进行迭代。 –
user463035818
你的意思是这样的:'&vec [0]'得到一个指向元素0的指针。但是如果在向量内有一对,仍然必须执行'vec [0] .first'或'vec [0 ] .second'。 – Aeonos
顺便说一句,这些对是在连续的内存中,但x(和y)不是 – user463035818