Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
19 / 11 / 0
Регистрация: 02.09.2010
Сообщений: 235
1

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

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

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

Resize() для вектора
Привет. Как сделать resize() так, чтобы "свободное пространство" вектора было заполнено нулями...

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

Определить для заданных векторов длину каждого вектора и найти номер самого длинного вектора
Создайте структуру Вектор с элементами x, y, z – декартовые координаты. Определить для M заданных...

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

13
5473 / 4868 / 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
Эксперт С++
5015 / 2594 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.07.2012, 09:41 3
Damaks, resize в итоге скорее всего просто вызовет тот же erase. Так что особо не переживайте.
0
Эксперт С++
8303 / 6057 / 602
Регистрация: 10.12.2010
Сообщений: 28,148
Записей в блоге: 26
24.07.2012, 13:21 4
А что в векторе хранится?
Если не указатели на объекты то волноваться не о чем.
0
Higher
1944 / 1210 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.07.2012, 15:59 5
Цитата Сообщение от Damaks Посмотреть сообщение
2. Корректно ли использовать resize в моем случае, или есть более правильные способы?
Если нужно удалять элементы с конца, то это наиболее эффективный способ, который должен работать быстрее чем pop_back и erase.
0
Эксперт С++
8303 / 6057 / 602
Регистрация: 10.12.2010
Сообщений: 28,148
Записей в блоге: 26
24.07.2012, 16:10 6
Ну то что эффективнее чем цикл с pop_back то понятно, но почему с erase ?
0
Higher
1944 / 1210 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.07.2012, 16:17 7
Цитата Сообщение от Avazart Посмотреть сообщение
Ну то что эффективнее чем цикл с pop_back то понятно, но почему с erase ?
erase рассчитан на общий случай, поэтому он не сможет так же эффективно выполнить удаление, как resize, которому нужно удалять только с конца(а это очень просто делается, просто изменяется значение size(), и вызываются деструкторы для удаленных объектов).
0
Эксперт С++
5015 / 2594 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.07.2012, 18:05 8
Цитата Сообщение от diagon Посмотреть сообщение
erase рассчитан на общий случай, поэтому он не сможет так же эффективно выполнить удаление, как resize, которому нужно удалять только с конца(а это очень просто делается, просто изменяется значение size(), и вызываются деструкторы для удаленных объектов).
Почему-то мне кажется, что erase достаточно умен, чтобы сравнить итератор с end().
0
Эксперт С++
8303 / 6057 / 602
Регистрация: 10.12.2010
Сообщений: 28,148
Записей в блоге: 26
24.07.2012, 18:21 9
чтобы сравнить итератор с end().
Ну как я понял на это и затраты.
0
Higher
1944 / 1210 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.07.2012, 18:56 10
Цитата Сообщение от fasked Посмотреть сообщение
Почему-то мне кажется, что erase достаточно умен, чтобы сравнить итератор с end().
Это ведь от реализации зависит.
Никто не дает гарантии, что он будет это делать.
А в случае с resize сложно реализовать как-то по другому.

Цитата Сообщение от Avazart Посмотреть сообщение
Ну как я понял на это и затраты.
В случае, если erase действительно сравнивает второй итератор с end(), то эти функции почти эквивалентными получаются, т.к. resize тоже сравнивает свой аргумент с текущим размером.
Хотя erase еще нужно вычислить новую длину массива :) Но это уже мелочи.
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
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
Эксперт С++
8303 / 6057 / 602
Регистрация: 10.12.2010
Сообщений: 28,148
Записей в блоге: 26
24.07.2012, 19:48 12
Так и не понял о чем вы...
И за счет чего снижение эффективности?
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2012, 20:58 13
Цитата Сообщение от Avazart Посмотреть сообщение
Так и не понял о чем вы...
И за счет чего снижение эффективности?
Насколько я понял, тут как раз о том, что снижения эффективность нет. Если новый размер равен или меньше старого, то что resize, что erase.
0
Эксперт С++
8303 / 6057 / 602
Регистрация: 10.12.2010
Сообщений: 28,148
Записей в блоге: 26
24.07.2012, 21:07 14
Ну так я об этом самого начала говорил....
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.07.2012, 21:07

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

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

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

Корректное удаление вектора векторов
Привет. Есть вектор векторов std::vector&lt;std::vector&lt;wchar_t&gt;&gt; data; Как правильно очистить это...

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


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

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

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