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

resize вектора векторов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
24.07.2012, 04:42     resize вектора векторов #1
Необходимо удалить n элементов с конца вектора. В vector::erase необходимо передавать итератор. Т.к. итератора у меня нет, а есть конкретная цифра сколько нужно удалить, вродебы подходит функция vector::resize.
Вопросы:
1. Если в векторе содержатся вектора, при использовании erase и resize они будут корректно удалены? Или произойдет утечка памяти?
2. Корректно ли использовать resize в моем случае, или есть более правильные способы?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2012, 04:42     resize вектора векторов
Посмотрите здесь:

C++ Символьной переменной L присвоить значение true, если отрицательная компонента вектора C встретится не позднее, чем у векторов A и B
C++ Использование вектора векторов
Даны два вектора X(20) и Y(20), найти длины векторов X, Y, X+Y, X-Y C++
C++ Создать класс для обработки векторов разность векторов норму векторов
Корректное удаление вектора векторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2012, 07:22     resize вектора векторов #2
Цитата Сообщение от Damaks Посмотреть сообщение
Т.к. итератора у меня нет
Его несложно получить с помощью методов вектора: begin(), end(). Удалить n элементов с конца вектора v,
C++
1
v.erase(v.end() - n, v.end());
или
C++
1
2
for (int i = 0; i < n; i++)
        v.pop_back();
или
C++
1
v.resize(v.size() - n);
Цитата Сообщение от Damaks Посмотреть сообщение
1. Если в векторе содержатся вектора, при использовании erase и resize они будут корректно удалены? Или произойдет утечка памяти?
Корректно.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
24.07.2012, 09:41     resize вектора векторов #3
Damaks, resize в итоге скорее всего просто вызовет тот же erase. Так что особо не переживайте.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
24.07.2012, 13:21     resize вектора векторов #4
А что в векторе хранится?
Если не указатели на объекты то волноваться не о чем.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.07.2012, 15:59     resize вектора векторов #5
Цитата Сообщение от Damaks Посмотреть сообщение
2. Корректно ли использовать resize в моем случае, или есть более правильные способы?
Если нужно удалять элементы с конца, то это наиболее эффективный способ, который должен работать быстрее чем pop_back и erase.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
24.07.2012, 16:10     resize вектора векторов #6
Ну то что эффективнее чем цикл с pop_back то понятно, но почему с erase ?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.07.2012, 16:17     resize вектора векторов #7
Цитата Сообщение от Avazart Посмотреть сообщение
Ну то что эффективнее чем цикл с pop_back то понятно, но почему с erase ?
erase рассчитан на общий случай, поэтому он не сможет так же эффективно выполнить удаление, как resize, которому нужно удалять только с конца(а это очень просто делается, просто изменяется значение size(), и вызываются деструкторы для удаленных объектов).
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
24.07.2012, 18:05     resize вектора векторов #8
Цитата Сообщение от diagon Посмотреть сообщение
erase рассчитан на общий случай, поэтому он не сможет так же эффективно выполнить удаление, как resize, которому нужно удалять только с конца(а это очень просто делается, просто изменяется значение size(), и вызываются деструкторы для удаленных объектов).
Почему-то мне кажется, что erase достаточно умен, чтобы сравнить итератор с end().
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
24.07.2012, 18:21     resize вектора векторов #9
чтобы сравнить итератор с end().
Ну как я понял на это и затраты.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.07.2012, 18:56     resize вектора векторов #10
Цитата Сообщение от fasked Посмотреть сообщение
Почему-то мне кажется, что erase достаточно умен, чтобы сравнить итератор с end().
Это ведь от реализации зависит.
Никто не дает гарантии, что он будет это делать.
А в случае с resize сложно реализовать как-то по другому.

Цитата Сообщение от Avazart Посмотреть сообщение
Ну как я понял на это и затраты.
В случае, если erase действительно сравнивает второй итератор с end(), то эти функции почти эквивалентными получаются, т.к. resize тоже сравнивает свой аргумент с текущим размером.
Хотя erase еще нужно вычислить новую длину массива :) Но это уже мелочи.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.07.2012, 19:23     resize вектора векторов #11
n3337 23.3.6

9 Effects: If sz <= size(), equivalent to erase(begin() + sz, end());. If size() < sz, appends
sz - size() value-initialized elements to the sequence.
10 Requires: T shall be CopyInsertable into *this.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
24.07.2012, 19:48     resize вектора векторов #12
Так и не понял о чем вы...
И за счет чего снижение эффективности?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2012, 20:58     resize вектора векторов #13
Цитата Сообщение от Avazart Посмотреть сообщение
Так и не понял о чем вы...
И за счет чего снижение эффективности?
Насколько я понял, тут как раз о том, что снижения эффективность нет. Если новый размер равен или меньше старого, то что resize, что erase.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2012, 21:07     resize вектора векторов
Еще ссылки по теме:

Заданы четыре вектора, найти сумму векторов в виде функции C++
Освободить память вектора векторов без swap C++
C++ Resize вектора вызывает ошибку

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
24.07.2012, 21:07     resize вектора векторов #14
Ну так я об этом самого начала говорил....
Yandex
Объявления
24.07.2012, 21:07     resize вектора векторов
Ответ Создать тему
Опции темы

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