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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
#1

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

12.07.2013, 01:47. Просмотров 851. Ответов 14
Метки нет (Все метки)

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 байта

Не по теме:

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

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2013, 01:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос что показывает std::vector::max_size (C++):

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами - C++
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию? - C++
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор. Размера .. Нужно его передать в...

Вывести значения std::vector<std::vector<int*> > - C++
Подскажите, как вывести значения? const size_t row = 3; const size_t col = 3; std::vector&lt;std::vector&lt;int*&gt; &gt; imatrix; //...

Как изменять размер std::vector<std::vector>? - C++
Здравствуйте, как нужно изменять размер std::vector&lt;std::vector&gt; например: std::vector&lt;std::vector&lt;float&gt;&gt; data; ...

Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator> - C++
Вопрос по вектору. Допустим есть вектор, std::vector&lt;int&gt; vec; на каком - то этапе заполнения я ставлю закладку итератора, ...

Vector::swap и std::move - что эффективнее? - C++
Пусть имеется пустой вектор A и заполненный некими данными вектор B. Тогда какой из методов более эффективный: A.swap(B); A =...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
12.07.2013, 01:59 #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Прочитал?
Понял, что при очередном пушбеке под вектор выделяется памяти "с запасом", чтобы серия пушбеков не затормозила из-за постоянных копирований вектора в новую память?
1
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
12.07.2013, 02:03  [ТС] #3
как раз про reserve только что прочитал)
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ты вообще понимаешь как пушбек работает?
записывает значение в конец вектора, т.е. память уже должна быть заранее выделена
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 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
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.07.2013, 02:28 #5
Цитата Сообщение от soican Посмотреть сообщение
ещё щяс меня кое-что разочаровало:
За автоматическое управление памятью приходится платить.
0
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
12.07.2013, 17:26  [ТС] #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;
}
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,417
Записей в блоге: 3
Завершенные тесты: 1
13.07.2013, 00:16 #7
Цитата Сообщение от soican Посмотреть сообщение
что я только что обнаружил!
Это же хорошо
Велосипед
C++
1
std::vector < int >(vec).swap(vec);
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
13.07.2013, 00:25 #8
Croessmah, Не понято зачем лишняя копия.
C++
1
std::vector<int>().swap(vec);
не?
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,417
Записей в блоге: 3
Завершенные тесты: 1
13.07.2013, 00:43 #9
Цитата Сообщение от ForEveR Посмотреть сообщение
не?
так после swap получим в vec вектор, который был временный - размером 0
а с копией - урезанный

Добавлено через 8 минут
С копией: http://ideone.com/cbxBFG
Без копии: http://ideone.com/SXpN3l
1
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
13.07.2013, 00:46 #10
Croessmah, Понято.) Логично, спасибо.
0
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
14.07.2013, 18:17  [ТС] #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;
}
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,417
Записей в блоге: 3
Завершенные тесты: 1
14.07.2013, 18:19 #12
Цитата Сообщение от soican Посмотреть сообщение
небольшой подводный камень
С чего он подводный? Простая инвалидация итератора
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
14.07.2013, 18:24 #13
soican, с shrink_to_fit тоже самое.
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,417
Записей в блоге: 3
Завершенные тесты: 1
14.07.2013, 18:28 #14
soican, Вообще после любой операции, которая может привести к перераспределению памяти, нужно считать все итераторы не валидными.

Добавлено через 1 минуту
Так что, если в Вашем коде сделать так:
C++
1
2
3
4
v.push_back(1);
it=v.begin();
v.push_back(2);
v.push_back(3);
it тоже можно считать не валидным и где тут подводный камень? Об этом рассказано в любом учебнике
0
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
14.07.2013, 19:55  [ТС] #15
Цитата Сообщение от Croessmah Посмотреть сообщение
Об этом рассказано в любом учебнике
)) в любом не любом, всех не прочитать же - для меня это было откровением
Цитата Сообщение от gray_fox Посмотреть сообщение
soican, с shrink_to_fit тоже самое.
буду иметь в виду
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2013, 19:55
Привет! Вот еще темы с ответами:

std::vector<int> Что это за тип данных? - C++
std::vector&lt;int&gt; indexes_1, indexes_2; // Used for homography Что это за тип данных?

Std::vector/QVector в классе или std::vector/QVector классов? - C++
Доброе время суток! Собственно вопрос в самой теме, есть некий класс class WorkJornal { private: string manager; ...

Реализация класса MyString. Стандартная библиотека, std::string, std::vector - C++
как добавить реализацию конкатенации строк через перегрузку оператора &quot;+=&quot; в классе MyString и почему ошибка выдается???#include...

Передача функции указатель на элемент std::vector<std::string> - C++
Доброй ночи тем, кому не спится (или живет в другом часовом поясе:p)! Есть функция, требующая в качестве параметра указатель на...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.07.2013, 19:55
Ответ Создать тему
Опции темы

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