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