Задать вопрос
@HabrArkady

Как реализовать алгоритм на С++?

Дан массив a0.
В цикле последовательно вычисляются
bi = F(ai), ai+1 = G(bi),
F, G – некоторые алгоритмы, 0 при a, i и (i+1) - индексы.
Причем размерность каждого следующего массива больше размерности предыдущего массива.
Во сколько раз больше становится известно только непосредственно перед вычислением каждого массива.
Можно завести максимально возможный размер каждого массива статически, при компиляции - так написал, все работает. При таком подходе, памяти может использоваться в десятки раз больше реально необходимого. Очень хочу минимизировать объем памяти.
В лоб, используя new и delete и только два имени a и b, - не получается, не позволяет синтаксис. Можно реализовать данный алгоритм, используя new и delete, правда, при этом, на каждой итерации придется заводит новое имя. Совсем не хочется играться с именами. Использовать умные указатели также не получается.
Вопрос: “Как реализовать такой алгоритм, используя динамическую память на С++ и только два имени”?
  • Вопрос задан
  • 124 просмотра
Подписаться 1 Простой 7 комментариев
Пригласить эксперта
Ответы на вопрос 2
@rPman
у тебя два пути, вместо массивов использовать списки (если нужен не последовательный доступ то придется с индексами, это +log(n) требований памяти) на основе std:list и индекса std:map (сильно фрагментирует память, что плохо в общем случае но просто для разработки) или расширять размер памяти под массив (с копированием содержимого из старого в новый), обычно увеличивают в два раза по мере роста массива - std:vector.

Так же есть готовая реализация, хранит массив крупными кусками std:deque (это если нужно итеративно по списку идти)
Ответ написан
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Используйте std::vector. Их можно присваивать как переменные. При этом там под капотом не будет никакого копирования, а просто изменение указателей в данном случае (так как правая часть - временное значение).
std::vector<int> a, b;
a = a0;
b = F(a);
for (int i = 1; i <= n; ++i) {
  a = G(b);
  b = F(a);
}


Если вас напрягает, что функции G и F выделяют память внутри, то можно сделать, чтобы они получали vector, в который надо вернуть значения:
void F(const vector<int> &a, vector<int>& res);
void G(const vector<int> &b, vector<int>& res);

std::vector<int> a, b;
a = a0;
b = F(a);
for (int i = 1; i <= n; ++i) {
  G(b, a);
  F(a, b);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы