Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
#1

Удалить несколько последних значений в динамическом массиве - C++

03.11.2012, 15:57. Просмотров 591. Ответов 10
Метки нет (Все метки)

Получил задание сделать задачу с использованием динамических таблиц и возник вопрос
если я объявляю массив через p = (int *)malloc(10*sizeof(int));
могу ли я как-то удалить несколько последних значений в массиве?
То есть , имея массив
1 2 3 4 5 6 7 8 9 10 , могу ли я просто убрать последние 3 значения? Чтобы размер массива с 10 стал 7?
или нужно создавать новый массив нужного размера и записывать значения туда?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2012, 15:57     Удалить несколько последних значений в динамическом массиве
Посмотрите здесь:

C++ Различные типы данных в динамическом массиве
Сдвиг в динамическом массиве C++
Реализация стека в динамическом массиве C++
C++ Преобразование типов в динамическом массиве
Циклический сдвиг в двумерном динамическом массиве C++
C++ Ошибка в одноиерном динамическом массиве
C++ Деление в двухмерном динамическом массиве
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12675 / 7183 / 801
Регистрация: 27.09.2012
Сообщений: 17,712
Записей в блоге: 2
Завершенные тесты: 1
03.11.2012, 16:01     Удалить несколько последних значений в динамическом массиве #2
Цитата Сообщение от maSt Посмотреть сообщение
Чтобы размер массива с 10 стал 7?
или нужно создавать новый массив нужного размера и записывать значения туда?
Именно! Но можете использовать realloc
maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
03.11.2012, 16:57  [ТС]     Удалить несколько последних значений в динамическом массиве #3
Прочитал про realloc на cplusplus , но не очень понял, как его можно тут использовать.
Можете привести пример?
kuli4ok
31 / 31 / 3
Регистрация: 10.10.2012
Сообщений: 88
03.11.2012, 17:02     Удалить несколько последних значений в динамическом массиве #4
в с++ вместо malloc лучше использовать new.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.11.2012, 17:48     Удалить несколько последних значений в динамическом массиве #5
Цитата Сообщение от maSt Посмотреть сообщение
Прочитал про realloc на cplusplus , но не очень понял, как его можно тут использовать.
Можете привести пример?
C
1
2
3
4
5
6
7
8
9
10
int *p = malloc(10 * sizeof(*p)); /* выделили под 10 интов */
/* ... */
int *new_p = realloc(p, 7 * sizeof(*p)); /* попытались выкинуть 3 с конца */
if (!new_p) {
    /* realloc() облажался и ничего не сделал, p указывает на тот же массив из 10 интов,
       new_p указывает в никуда */
}
else {
    p = new_p;
}
Но для Си++ действительно только один вариант: выделить новый массив, скопировать туда барахло, удалить старый массив.

Как вариант: просто тактично игнорировать последние три элемента :) Копировать придётся только при росте массива.
mmd
13 / 13 / 1
Регистрация: 17.05.2012
Сообщений: 80
03.11.2012, 18:50     Удалить несколько последних значений в динамическом массиве #6
malloc это функция из чистого си
в C++ для этого есть new
maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
03.11.2012, 21:15  [ТС]     Удалить несколько последних значений в динамическом массиве #7
Да у меня в задании нужно использовать malloc,realloc и так далее.
Не знаю как, но у меня получилось уменьшать количество выделенного пространства realloc'ом.

Но появилась новый вопрос.
могу ли я использовать realloc в качестве malloc'a?
то есть, будут ли равнозначны записи
C++
1
r = (int*)realloc(NULL,(R)*sizeof(int));
и
C++
1
p = (int *)malloc(R*sizeof(int));
?
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.11.2012, 21:51     Удалить несколько последних значений в динамическом массиве #8
Да. И в качестве free() тоже, если указать нулевой размер.
Somebody
2777 / 1591 / 142
Регистрация: 03.12.2007
Сообщений: 4,169
Завершенные тесты: 1
03.11.2012, 22:38     Удалить несколько последних значений в динамическом массиве #9
Насчёт замены free - как-то сомнительно.
Цитата Сообщение от www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (7.22.3.1)
If the size of the space requested is zero, the behavior is implementation-defined: either a null pointer is returned, or the behavior is as if the size were some nonzero value, except that the returned pointer shall not be used to access an object.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.11.2012, 00:14     Удалить несколько последних значений в динамическом массиве #10
Ну, я думаю, это касается того, какой указатель вернёт realloc(). То есть она не обязательно вернёт NULL или что-то в этом роде, но вот очистить память от всех старых объектов должна (7.22.3.5/1 чуть ниже).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2012, 12:37     Удалить несколько последних значений в динамическом массиве
Еще ссылки по теме:

C++ Музыкальная картотека в динамическом массиве
Как исправить ошибку в динамическом массиве? C++
C++ В динамическом массиве удалить N элементов, начиная с номера K (ошибка)
C++ Работа со строками в двумерном динамическом массиве
C++ Удаление столбца в двумерном динамическом массиве

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Somebody
2777 / 1591 / 142
Регистрация: 03.12.2007
Сообщений: 4,169
Завершенные тесты: 1
04.11.2012, 12:37     Удалить несколько последних значений в динамическом массиве #11
От старых объектов он память очистит, но если возвращается ненулевой указатель, то это значит, что размер этого пустого объекта всё равно где-то хранится и этот объект всё равно занимает адресное пространство (так как у другого объекта не может быть тот же адрес).
Yandex
Объявления
04.11.2012, 12:37     Удалить несколько последних значений в динамическом массиве
Ответ Создать тему
Опции темы

Текущее время: 19:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru