У меня есть алгоритм, который ожидает 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
и т.д.