2017-02-17 240 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

相關問題