Карты памяти 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.
Брус изменить функцию, чтобы работать над вектором, как это? Если нет, вам нужно пройти через массив и заполнить новый вектор. В качестве альтернативы вы могли бы написать свои собственные итераторы для 'vector>', которые будут итерации на первом/втором соответственно. –
user463035818
Вы имеете в виду что-то вроде этого: '& vec [0]', чтобы получить указатель на элемент 0. Но если есть пара внутри вектора, еще нужно сделать 'vec [0] .first' или' vec [0 ] .second'. – Aeonos
btw пары находятся в непрерывной памяти, но x (и y) не являются – user463035818