Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
Damaks
18 / 10 / 0
Регистрация: 02.09.2010
Сообщений: 235
1

resize вектора векторов

24.07.2012, 04:42. Просмотров 1536. Ответов 13
Метки нет (Все метки)

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

Resize вектора вызывает ошибку
std::vector<MyClass*> vec; vec.resize(1, NULL) vec = new MyClass(); ...

Использование вектора векторов
Нужно хранить символы в координатах, например, на пятой строчке, третьей...

Использование вектора векторов
Здравствуйте, у меня возник вопрос, который я не могу понять, как решить....

Заполнение вектора векторов
Изучаю вектора, поискал похожие темы до 14 года, вроде бы разные варианты...

Корректное удаление вектора векторов
Привет. Есть вектор векторов std::vector<std::vector<wchar_t>> data; Как...

13
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2012, 07:22 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 они будут корректно удалены? Или произойдет утечка памяти?
Корректно.
1
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.07.2012, 09:41 3
Damaks, resize в итоге скорее всего просто вызовет тот же erase. Так что особо не переживайте.
0
Avazart
Эксперт С++
7735 / 5645 / 550
Регистрация: 10.12.2010
Сообщений: 25,483
Записей в блоге: 17
24.07.2012, 13:21 4
А что в векторе хранится?
Если не указатели на объекты то волноваться не о чем.
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.07.2012, 15:59 5
Цитата Сообщение от Damaks Посмотреть сообщение
2. Корректно ли использовать resize в моем случае, или есть более правильные способы?
Если нужно удалять элементы с конца, то это наиболее эффективный способ, который должен работать быстрее чем pop_back и erase.
0
Avazart
Эксперт С++
7735 / 5645 / 550
Регистрация: 10.12.2010
Сообщений: 25,483
Записей в блоге: 17
24.07.2012, 16:10 6
Ну то что эффективнее чем цикл с pop_back то понятно, но почему с erase ?
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.07.2012, 16:17 7
Цитата Сообщение от Avazart Посмотреть сообщение
Ну то что эффективнее чем цикл с pop_back то понятно, но почему с erase ?
erase рассчитан на общий случай, поэтому он не сможет так же эффективно выполнить удаление, как resize, которому нужно удалять только с конца(а это очень просто делается, просто изменяется значение size(), и вызываются деструкторы для удаленных объектов).
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.07.2012, 18:05 8
Цитата Сообщение от diagon Посмотреть сообщение
erase рассчитан на общий случай, поэтому он не сможет так же эффективно выполнить удаление, как resize, которому нужно удалять только с конца(а это очень просто делается, просто изменяется значение size(), и вызываются деструкторы для удаленных объектов).
Почему-то мне кажется, что erase достаточно умен, чтобы сравнить итератор с end().
0
Avazart
Эксперт С++
7735 / 5645 / 550
Регистрация: 10.12.2010
Сообщений: 25,483
Записей в блоге: 17
24.07.2012, 18:21 9
чтобы сравнить итератор с end().
Ну как я понял на это и затраты.
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.07.2012, 18:56 10
Цитата Сообщение от fasked Посмотреть сообщение
Почему-то мне кажется, что erase достаточно умен, чтобы сравнить итератор с end().
Это ведь от реализации зависит.
Никто не дает гарантии, что он будет это делать.
А в случае с resize сложно реализовать как-то по другому.

Цитата Сообщение от Avazart Посмотреть сообщение
Ну как я понял на это и затраты.
В случае, если erase действительно сравнивает второй итератор с end(), то эти функции почти эквивалентными получаются, т.к. resize тоже сравнивает свой аргумент с текущим размером.
Хотя erase еще нужно вычислить новую длину массива :) Но это уже мелочи.
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.07.2012, 19:23 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.
1
Avazart
Эксперт С++
7735 / 5645 / 550
Регистрация: 10.12.2010
Сообщений: 25,483
Записей в блоге: 17
24.07.2012, 19:48 12
Так и не понял о чем вы...
И за счет чего снижение эффективности?
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2012, 20:58 13
Цитата Сообщение от Avazart Посмотреть сообщение
Так и не понял о чем вы...
И за счет чего снижение эффективности?
Насколько я понял, тут как раз о том, что снижения эффективность нет. Если новый размер равен или меньше старого, то что resize, что erase.
0
Avazart
Эксперт С++
7735 / 5645 / 550
Регистрация: 10.12.2010
Сообщений: 25,483
Записей в блоге: 17
24.07.2012, 21:07 14
Ну так я об этом самого начала говорил....
0
24.07.2012, 21:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2012, 21:07

Даны два вектора X(20) и Y(20), найти длины векторов X, Y, X+Y, X-Y
Помогите найти ошибку, пишет &quot;vector subscript out of range&quot;. #include...

Освободить память вектора векторов без swap
Собственно будет ли &quot;Swap-To-Fit&quot; std::vector&lt;std::vector&lt;double&gt;&gt;...

Найти максимальные элементы во всех столбцах вектора векторов
Дан вектор векторов vector&lt;vector&lt;float&gt;&gt; vect; как найти максимальные...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru