1 | |||||||||||
Что показывает std::vector::max_size?12.07.2013, 01:47. Просмотров 2330. Ответов 14
Метки нет Все метки)
(
Returns the maximum number of elements that the vector can hold.
но я щяс запускаю на ноутбуке с гигом оперативы
Добавлено через 7 минут ещё щяс меня кое-что разочаровало:
Не по теме: Хватит это терпеть!
0
|
|
12.07.2013, 01:47 | |
Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию? Как изменять размер std::vector<std::vector>? Вывести значения std::vector<std::vector<int*> > |
|
12.07.2013, 01:59 | 2 | |||||
Если последовательно делать push_back по одному элементу в вектор, последует серия расширений вектора.
То есть на каждом шаге цикла, будет происходить выделение нового блока памяти больше старого и поэлементное копирование данных из старого блока в новый Не по теме: (т.е. не совсем на каждом шаге, т.к. каждый новый пушбек выделяет память с некоторым запасом, но этот запас через несколько итераций будет кончаться и произойдёт новое тормознутое перевыделение.) В таких случаях используй vector::reserve перед длительной серией пушбеков.
как и следовало ожидать, вываливается исключение о нехватке памяти Добавлено через 45 секунд чего хватит терпеть? Ты вообще понимаешь как пушбек работает? http://alenacpp.blogspot.ru/2005/06/vector_30.htmlПрочитал? Понял, что при очередном пушбеке под вектор выделяется памяти "с запасом", чтобы серия пушбеков не затормозила из-за постоянных копирований вектора в новую память?
1
|
12.07.2013, 02:09 | 4 |
Ты вообще понимаешь как пушбек работает? http://alenacpp.blogspot.ru/2005/06/vector_30.htmlПрочитал?
Понял, что при очередном пушбеке под вектор выделяется памяти "с запасом", чтобы серия пушбеков не затормозила из-за постоянных копирований вектора в новую память? В твоём случае, после того, как ты по очереди стал запихивать элементы, вектор сначала выделил массив под пару элементов, потом удалил и выделил под 3, под 4, под 6, под 9, под 13, под 19 Запас брался всё больше и больше, т.к. вектор "догадывался", что 20ю пушбеками ты не ограничишься и выделял под 28 с запасом, потом под 42... и.т.д. потом плюнул на всё и выделил память под 4096 байт. Как же он мог знать, что ты на 1025ом байте закончишь?
0
|
12.07.2013, 17:26 [ТС] | 6 | |||||
не ну reserve решает вопрос.
Добавлено через 14 часов 47 минут спешу рассказать всему миру, что я только что обнаружил! std::vector::shrink_to_fit(с++11 only) http://www.cplusplus.com/refer... nk_to_fit/ душит всю ту лишнюю память которую выделяет для себя std::vector
0
|
В астрале
![]() 8028 / 4785 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
|
||||||
13.07.2013, 00:25 | 8 | |||||
Croessmah, Не понято зачем лишняя копия.
0
|
Don't worry, be happy
|
|
13.07.2013, 00:43 | 9 |
так после swap получим в vec вектор, который был временный - размером 0
![]() а с копией - урезанный ![]() Добавлено через 8 минут С копией: http://ideone.com/cbxBFG Без копии: http://ideone.com/SXpN3l
1
|
В астрале
![]() 8028 / 4785 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
|
|
13.07.2013, 00:46 | 10 |
Croessmah, Понято.) Логично, спасибо.
0
|
14.07.2013, 18:17 [ТС] | 11 | |||||
кстати тут имеется небольшой подводный камень
0
|
What a waste!
1579 / 1279 / 172
Регистрация: 21.04.2012
Сообщений: 2,683
|
|
14.07.2013, 18:24 | 13 |
soican, с shrink_to_fit тоже самое.
0
|
Don't worry, be happy
|
||||||
14.07.2013, 18:28 | 14 | |||||
soican, Вообще после любой операции, которая может привести к перераспределению памяти, нужно считать все итераторы не валидными.
Добавлено через 1 минуту Так что, если в Вашем коде сделать так:
![]()
0
|
14.07.2013, 19:55 [ТС] | 15 |
)) в любом не любом, всех не прочитать же - для меня это было откровением
буду иметь в виду
0
|
14.07.2013, 19:55 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator> Vector::swap и std::move - что эффективнее? std::vector<int> Что это за тип данных?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |