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

что показывает std::vector::max_size - C++

Восстановить пароль Регистрация
 
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
12.07.2013, 01:47     что показывает std::vector::max_size #1
Returns the maximum number of elements that the vector can hold.
но я щяс запускаю на ноутбуке с гигом оперативы
C++
1
for (int i=0; i<1E9; i++) myvector.push_back(i);
естеественно залёт...к чему он тогда? нафиг не нужен?

Добавлено через 7 минут
ещё щяс меня кое-что разочаровало:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <vector>
 
int main ()
{
  std::vector<int> myvector;
  // set some content in the vector:
  for (int i=0; i<1025; i++) myvector.push_back(i);
 
  std::cout << "size: " << (int) myvector.size() << '\n';
  std::cout << "capacity: " << (int) myvector.capacity() << '\n';
  std::cout << "max_size: " << (int) myvector.max_size() << '\n';
  return 0;
}
capacity покажет 2048, т.е. он сожрал лишних 1023х4=4092 байта

Не по теме:

Хватит это терпеть!

Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2013, 01:47     что показывает std::vector::max_size
Посмотрите здесь:

std::vector<int> Что это за тип данных? C++
C++ std::vector
std::vector::erase C++
Вывести значения std::vector<std::vector<int*> > C++
std::vector пустой C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
12.07.2013, 01:59     что показывает std::vector::max_size #2
Если последовательно делать push_back по одному элементу в вектор, последует серия расширений вектора.

То есть на каждом шаге цикла, будет происходить выделение нового блока памяти больше старого и поэлементное копирование данных из старого блока в новый

Не по теме:

(т.е. не совсем на каждом шаге, т.к. каждый новый пушбек выделяет память с некоторым запасом, но этот запас через несколько итераций будет кончаться и произойдёт новое тормознутое перевыделение.)


В таких случаях используй vector::reserve перед длительной серией пушбеков.
C++
1
2
3
4
5
6
7
8
    try{
      myvector.reserve(1E9);
      for (int i=0; i<1E9; i++) 
          myvector.push_back(i);
  }
  catch(std::bad_alloc){
      std::cerr<<"Error"<<std::endl;
  }
Ну и за одно, как видишь, ещё мы отлавливаем исключения, которые при этом возникают...
как и следовало ожидать, вываливается исключение о нехватке памяти

Добавлено через 45 секунд
Цитата Сообщение от soican Посмотреть сообщение
capacity покажет 2048, т.е. он сожрал лишних 1023х4=4092 байта
Не по теме:
Хватит это терпеть!
чего хватит терпеть? Ты вообще понимаешь как пушбек работает? http://alenacpp.blogspot.ru/2005/06/vector_30.htmlПрочитал?
Понял, что при очередном пушбеке под вектор выделяется памяти "с запасом", чтобы серия пушбеков не затормозила из-за постоянных копирований вектора в новую память?
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
12.07.2013, 02:03  [ТС]     что показывает std::vector::max_size #3
как раз про reserve только что прочитал)
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ты вообще понимаешь как пушбек работает?
записывает значение в конец вектора, т.е. память уже должна быть заранее выделена
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
12.07.2013, 02:09     что показывает std::vector::max_size #4
Ты вообще понимаешь как пушбек работает? http://alenacpp.blogspot.ru/2005/06/vector_30.htmlПрочитал?
Понял, что при очередном пушбеке под вектор выделяется памяти "с запасом", чтобы серия пушбеков не затормозила из-за постоянных копирований вектора в новую память?
В твоём случае, после того, как ты по очереди стал запихивать элементы, вектор сначала выделил массив под пару элементов, потом удалил и выделил под 3, под 4, под 6, под 9, под 13, под 19
Запас брался всё больше и больше, т.к. вектор "догадывался", что 20ю пушбеками ты не ограничишься и выделял под 28 с запасом,
потом под 42... и.т.д.
потом плюнул на всё и выделил память под 4096 байт.
Как же он мог знать, что ты на 1025ом байте закончишь?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.07.2013, 02:28     что показывает std::vector::max_size #5
Цитата Сообщение от soican Посмотреть сообщение
ещё щяс меня кое-что разочаровало:
За автоматическое управление памятью приходится платить.
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
12.07.2013, 17:26  [ТС]     что показывает std::vector::max_size #6
Цитата Сообщение от alsav22 Посмотреть сообщение
За автоматическое управление памятью приходится платить.
не ну reserve решает вопрос.

Добавлено через 14 часов 47 минут
спешу рассказать всему миру, что я только что обнаружил!
std::vector::shrink_to_fit(с++11 only) http://www.cplusplus.com/reference/v...shrink_to_fit/
душит всю ту лишнюю память которую выделяет для себя std::vector
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
int main ()
{std::vector<int> myvector (100);
  std::cout << "1. capacity of myvector: " << myvector.capacity() << '\n';
 
  myvector.resize(10);
  std::cout << "2. capacity of myvector: " << myvector.capacity() << '\n';
 
  myvector.shrink_to_fit();
  std::cout << "3. capacity of myvector: " << myvector.capacity() << '\n';
  return 0;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
13.07.2013, 00:16     что показывает std::vector::max_size #7
Цитата Сообщение от soican Посмотреть сообщение
что я только что обнаружил!
Это же хорошо
Велосипед
C++
1
std::vector < int >(vec).swap(vec);
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.07.2013, 00:25     что показывает std::vector::max_size #8
Croessmah, Не понято зачем лишняя копия.
C++
1
std::vector<int>().swap(vec);
не?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
13.07.2013, 00:43     что показывает std::vector::max_size #9
Цитата Сообщение от ForEveR Посмотреть сообщение
не?
так после swap получим в vec вектор, который был временный - размером 0
а с копией - урезанный

Добавлено через 8 минут
С копией: http://ideone.com/cbxBFG
Без копии: http://ideone.com/SXpN3l
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.07.2013, 00:46     что показывает std::vector::max_size #10
Croessmah, Понято.) Логично, спасибо.
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
14.07.2013, 18:17  [ТС]     что показывает std::vector::max_size #11
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
std::vector < int >(vec).swap(vec);
кстати тут имеется небольшой подводный камень
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
 
using namespace std;
 
int main()
{
std::vector <int> v;
std::vector <int>::iterator it;
 
v.push_back(1);
v.push_back(2);
v.push_back(3);
 
it=v.begin();
cout<<*it<<endl; // получаем то, что надо
vector<int>(v).swap(v); // меняем с самим собой
cout<<*it<<endl; // получаем фигню
it=v.begin(); // переинициализируем it
cout<<*it<<endl; // получаем то, что надо
return 0;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
14.07.2013, 18:19     что показывает std::vector::max_size #12
Цитата Сообщение от soican Посмотреть сообщение
небольшой подводный камень
С чего он подводный? Простая инвалидация итератора
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
14.07.2013, 18:24     что показывает std::vector::max_size #13
soican, с shrink_to_fit тоже самое.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
14.07.2013, 18:28     что показывает std::vector::max_size #14
soican, Вообще после любой операции, которая может привести к перераспределению памяти, нужно считать все итераторы не валидными.

Добавлено через 1 минуту
Так что, если в Вашем коде сделать так:
C++
1
2
3
4
v.push_back(1);
it=v.begin();
v.push_back(2);
v.push_back(3);
it тоже можно считать не валидным и где тут подводный камень? Об этом рассказано в любом учебнике
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2013, 19:55     что показывает std::vector::max_size
Еще ссылки по теме:

C++ Vector::swap и std::move - что эффективнее?
C++ Std::vector
Как изменять размер std::vector<std::vector>? C++

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

Или воспользуйтесь поиском по форуму:
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
14.07.2013, 19:55  [ТС]     что показывает std::vector::max_size #15
Цитата Сообщение от Croessmah Посмотреть сообщение
Об этом рассказано в любом учебнике
)) в любом не любом, всех не прочитать же - для меня это было откровением
Цитата Сообщение от gray_fox Посмотреть сообщение
soican, с shrink_to_fit тоже самое.
буду иметь в виду
Yandex
Объявления
14.07.2013, 19:55     что показывает std::vector::max_size
Ответ Создать тему
Опции темы

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