2017-02-17 9 views
1

Есть ли способ получить смежную память «.first» и «.econd» от vector<pair<double,double>>? То, что я имею в виду:C++ конвертировать вектор <пара <двойной, двойной >> в 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

btw пары находятся в непрерывной памяти, но x (и y) не являются – user463035818

ответ

2

Карты памяти 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); 
} 

б) преобразовать 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()); 
} 

с) просто изменить ОПРЕДЕЛЕНИЯ из xy в x и y.

Если вы можете изменить func, я предлагаю рефакторинг, чтобы вы могли вызвать внутренний цикл и переписать его для итераторов (или диапазонов). Таким образом, вы можете использовать его с проекциями на std::pair.

Here is the full source code.

+0

aha, интересно отметить, что A не будет работать, потому что эта конкретная функция требует суммирования нескольких индексов для изменения значения y (a la convolution). Таким образом, похоже, что единственным вариантом является использование «отдельно x и y», а не «пара x и y» или изменение функции. –

+0

Я добавил исходный код для преобразования вектора в отдельные. Следует проявлять осторожность, если вектор большой. Я не уверен в дополнительных распределениях и копиях через вызов 'std :: make_pair'. – Maikel

 Смежные вопросы

  • Нет связанных вопросов^_^