Удалить части динамического массива и увеличить другие - PullRequest
2 голосов
/ 28 сентября 2010

Мне нужен динамический массив, поэтому мне нужно выделить необходимый объем памяти через указатель. Что заставляет меня задуматься о том, что является хорошим решением, так это то, что C ++ может делать что-то вроде:

int * p = new int[6];

, который выделяет необходимый массив. Что мне нужно, так это то, что впоследствии я хочу вырастить некоторые части этого массива. Пример с ошибками:

int *p1 = &p[0];
int *p2 = &p[2];
int *p3 = &p[4];
// delete positions p[2], p[3]
delete [] p2;
// create new array
p2 = new int[4];

Я не знаю, как этого добиться.

РЕДАКТИРОВАТЬ: std::vector не работает для меня, поскольку мне нужно, чтобы время вставки / удаления элементов k было пропорционально числу k, а не количеству элементов, хранящихся в std::vector.

В общем случае, используя указатели, я бы указывал на начало любой не непрерывной области памяти и учитывал, сколько элементов она хранит. Концептуально, я бы разбил большой массив на множество маленьких и не обязательно в непрерывном пространстве в памяти (удаление создает «дыры», в то время как распределение не обязательно «заполняет» их).

Ответы [ 4 ]

8 голосов
/ 28 сентября 2010

Такое поведение достигается с помощью std::vector:

std::vector<int> v(6);         // create a vector with six elements.
v.erase(v.begin() + 2);        // erase the element at v[2]
v.insert(v.begin() + 2, 4, 0); // insert four new elements starting at v[2]

Действительно, всякий раз, когда вы хотите использовать динамически размещенный массив, вы должны сначала рассмотреть возможность использования std::vector. Это не решение каждой проблемы, но наряду с остальными контейнерами стандартной библиотеки C ++ это определенно решение большинства проблем.

1 голос
/ 28 сентября 2010

другой вариант, кроме std::vector - std::deque, который работает почти так же, но немного более эффективно при вставке кусков в середину. Если это все еще недостаточно для вас, вы можете получить некоторый пробег, используя коллекцию коллекций. Вам придется проделать немного больше работы, чтобы получить произвольный доступ к работе (возможно, написать класс, чтобы обернуть все это целиком.

1 голос
/ 28 сентября 2010

Я бы посоветовал не делать это самостоятельно. Ищите std::vector разумную отправную точку.

1 голос
/ 28 сентября 2010

Вы должны посмотреть на контейнеры STL в C ++, например, vector обладает практически всеми необходимыми вам функциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...