Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/22: Рейтинг темы: голосов - 22, средняя оценка - 4.68
 Аватар для Lyosha12
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313

Каким образом vector (STL, C++11/14) удаляет элементы из внутреннего массива?

01.06.2017, 14:23. Показов 4713. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Судя по отладчику, для объекта не просто вызывается деструктор при вызове pop_back(). Объект также пропадает, если смотреть над доступные элементы вектора, в отладчике.

Я попытался это повторить, но такое поведение достигается только созданием нового массива и копированием туда предыдущего - только так я вижу уменьшение количества элементов в отладчике. Однако, массив нового или меньшего размера вектор не создаёт - его вместимость постоянна при удалении объектов и может уменьшиться только при вызове shrink_to_fit().

Так как же реализовано такое поведение?
Среда - CLion 2017.3.4. Компилятор - MinGW.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.06.2017, 14:23
Ответы с готовыми решениями:

Каким образом унинсталлер удаляет себя же?
Каким образом унинсталлер удаляет себя же?

Каким образом getchar() меняет содержимое массива?
Здравствуйте! Почему-то наличие getchar(); в коде влияет на содержимое массива. Если данный код не менять - то выводит правильный...

Пробел в старшем и младшем байте массива. Каким образом?!
Здравствуйте форумчане! Решил сделать задачку по с++, но столкнулся с проблемой: Нужно заполнить двумерный массив символами и написать...

32
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
01.06.2017, 16:09
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Lyosha12 Посмотреть сообщение
А разве вектор из STL не делает то же самое?
То же. Вопрос к чему? Как работает отладчик? Тебе уже рассказали:
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
IDE в курсе как устроен стандартный контейнер, в отличии от каких-то других поделок, так что может удобно представить информацию, полученную от отладчика. Показывать удаленные элементы смысла не имеет.
Твой контейнер отладчик (или IDE) не знает, поэтому:
Цитата Сообщение от nd2 Посмотреть сообщение
У тебя отладчик как показывает содержимое блока памяти, выделенного в куче?
1
 Аватар для Lyosha12
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313
01.06.2017, 16:09  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
У тебя отладчик как показывает содержимое блока памяти, выделенного в куче?
Скорее всего да. Выделяю участок и прикрепляю его к указателю на начало, устанавливаю конец. Вроде бы так же делает и вектор из STL.
0
53 / 31 / 13
Регистрация: 21.05.2017
Сообщений: 109
01.06.2017, 16:10
Цитата Сообщение от Lyosha12 Посмотреть сообщение
Мой, в отличии от вектора, ни от чего не наследуется
Посему, для сохранения пустого аллокатора ему бы потребовалось больше памяти под объект. Вектор же (в gcc), наследуется от _Vector_base, а тот уже содержит объект класса _Vector_impl, который, в свою очередь, наследуется от переданного типа аллокатора (с предварительным rebind). Таким образом вектор сохраняет пустой объект-аллокатор не используя памяти.
Магия! Вжух!

Цитата Сообщение от Lyosha12 Посмотреть сообщение
сразу реализовать функции вектора
Ну и откуда отладчик и ide будут знать как со всем этим добром работать?
1
 Аватар для Lyosha12
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313
01.06.2017, 16:11  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Твой контейнер отладчик не знает
Значит, мне нужно либо наследоваться от типов, объявленных в STL, либо разбираться с аллокаторами? Как добиться желаемого поведения?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
01.06.2017, 16:13
Цитата Сообщение от Lyosha12 Посмотреть сообщение
Как добиться желаемого поведения?
...
Цитата Сообщение от nd2 Посмотреть сообщение
Отладчика?

Не по теме:

Второй круг.

0
53 / 31 / 13
Регистрация: 21.05.2017
Сообщений: 109
01.06.2017, 16:14
Лучший ответ Сообщение было отмечено Lyosha12 как решение

Решение

Цитата Сообщение от Lyosha12 Посмотреть сообщение
Как добиться желаемого поведения?
Если IDE поддерживает какие-то плагины, то, наверное, написать плагин, который будет корректно выводить содержимое контейнера. Вектор - контейнер стандартный, так что инструментарий в курсе всего его интерфейса и поведения.
1
 Аватар для Lyosha12
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313
01.06.2017, 16:17  [ТС]
Хорошо, спасибо. Нужно дальше копать STL и IDE. Мало знаю ещё о внутренних договорённостях
0
53 / 31 / 13
Регистрация: 21.05.2017
Сообщений: 109
01.06.2017, 16:30
Лучший ответ Сообщение было отмечено Lyosha12 как решение

Решение

Lyosha12, для gdb(в консоли) можно написать нечто такое:
print *(v.arrayBegin)@(v.arrayEnd-v.arrayBegin)
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.06.2017, 22:53
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
//концептуально
pop_back()
{
* *(--finish)->~T();
}
здесь ошибка.
0
53 / 31 / 13
Регистрация: 21.05.2017
Сообщений: 109
02.06.2017, 07:47
Цитата Сообщение от hoggy Посмотреть сообщение
здесь ошибка.
Обычно, люди еще описывают суть проблемы.
0
 Аватар для Lyosha12
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313
31.08.2017, 13:59  [ТС]
Не смог я правильно выразиться. Я всего лишь хотел, чтобы среда отображала элементы массива в куче, как это происходило бы с массивом на стеке. А добиться этого очень просто, оказывается:
C++
1
2
    int* a = new int[5] {1, 2, 3, 4, 5};
    int (&b)[5] = *static_cast<int(*)[5]> (static_cast<void*> (a));
0
17 / 16 / 3
Регистрация: 18.08.2017
Сообщений: 54
31.08.2017, 14:52
Цитата Сообщение от Lyosha12 Посмотреть сообщение
И ещё интересное дело - среда не может найти функцию деструктора, которая здесь вызывается
Естественно, не может найти. Это же шаблон функции, где _Tp это параметр шаблона.
1
 Аватар для Lyosha12
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313
31.08.2017, 14:54  [ТС]
Цитата Сообщение от УГнетатель Посмотреть сообщение
Естественно, не может найти. Это же шаблон функции, где _Tp это параметр шаблона.
Об этом я узнал неделей позже
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.08.2017, 14:54

Каким образом лучше осуществить вывод массива с помощью графики?
Добрый день! Имеется массив размера примерно 1000 на 500. Некоторые ячейки закрашенные, некоторые нет. Каким образом лучше осуществить...

Массив: каким образом можно изменить размер многомерного массива
Я на 100% уверен что вопрос неоднократно поднимался до меня, поэтому заранее прошу прощения за эту тему.. Я просто ни как не могу найти...

Каким образом создать поток, в который перенести код сортировки массива?
Спасибо keepitsimple3, за код #include &quot;lb.h&quot; // включения файлов в код сценария PHP во время исполнения. char s; char s2; ...

Каким символом и каким образом отобразить пробел в document.write
Вот код var mailExample = /^(+)@((+\.)+{2,6})$/; var Str = &quot;hoolio934@mail.ru&quot;; var Str1 = &quot;5252672@mail.ru&quot;; var Str2 =...

Шахматы. Каким образом можно задать соответствие полей, координат и индексов массива
Доброго времени суток, уважаемые форумчане! Передо мной стоит задача сделать интерфейс по уже практически допиленному движку игры...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru