У меня есть алгоритм, который ожидает std::vector (назовите его A). Однако у меня уже есть B с элементами N + 2, и я в основном хочу передать B.data() + 2, поэтому алгоритм получает последние N записи из B. Если A изменено, то и B.
При использовании указателей double* это совершенно ясно, как я должен это сделать, но возможно ли это также с std::vector s? Я имею в виду, что хорошая вещь с вектором заключается в том, что он обрабатывает память для меня, и теперь я хочу ее запретить (если B или A будут уничтожены, они должны оставить заостренные данные нетронутыми).
Вот так:
std::vector< double > B({1,2,3,4,5});
std::vector< double > A(B.data() + 2, B.size() - 2);
// A and B share data now. A is 3, 4, 5
Я знаю, что для этой цели алгоритм может быть лучше разработан, взяв пару итераторов, но это не в моих руках.
ОБНОВЛЕНИЕ
(В комментариях хотелось бы видеть подпись, вот она)
nlopt::result nlopt::opt::optimize(std::vector<double> &x, double &opt_f);
Однако мое первоначальное намерение состояло в том, чтобы быть очень умным и позволить алгоритму оптимизировать direclty в моем векторе B, поэтому у меня получилось что-то вроде этого:
std::vector< double > B(N + 2);
// do something with it here, like put initial values
std::vector< double > A( B.begin() + 2, B.end() );
optimize( A );
std::copy(A.begin(), A.end(), B.begin() + 2);
Я действительно не беспокоюсь об этом обходном пути, я также прочитал в документации nlopt, что векторы являются внутренними копиями в любом случае несколько раз, если использовать С++-интерфейс вместо C.
Но опять же, этот пример действительно открыл мне глаза на дизайн интерфейса алгоритма и что стоит потратить некоторое время на просмотр через, например, библиотеки ускорения, такие как range и т.д.