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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
ninja2
814 / 188 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

Непонятные функции std::vector - C++

15.05.2013, 19:21. Просмотров 1310. Ответов 39
Метки нет (Все метки)

Здорова господа!
Тут я решил своими словами описать стандартные контейнеры их всего 14. Решил описать с примерчиками возможности каждого контейнера, оно и мне полезно стл как раз изучу, да и мб новичок новичку пригодится, а то на офф сайте фиг, что поймешь, а русских ресурсов мало, поэтому решил свой ресурс создать по стл.
Ну а что там стл маленькая 14 контейнеров и 60 алгоритмов все го то.

Ну ладно в общем щас описываю std::vector и тут у меня возникла проблема никак не пойму, что делают эти методы
capacity(), size() и reserve(). Пытаюсь посмотреть, что выводится:
C++
1
2
3
4
5
6
7
8
9
10
11
        vector<int> vec(30,444);//10 элементов, значение 7
    cout <<"vec.size()= "<<vec.size()<<endl;//30
    cout <<"vec.capacity()= "<<vec.capacity()<<endl;//30
    
        vec.reserve(35);//увеличивает емкость 
    cout <<"vec.size()= "<<vec.size()<<endl;//30
    cout <<"vec.capacity()= "<<vec.capacity()<<endl;//35
 
        vec.reserve(35);//увеличивает емкость 
    cout <<"vec.size()= "<<vec.size()<<endl;//30
    cout <<"vec.capacity()= "<<vec.capacity()<<endl;//35
Что такое capacity() это мощьность, а что за мощьность?
И еще reserve() допустим оно меняет размер этой capacity но оно почему то меняет только в большую сторону.
От если я пытаюсь сделать больше то оно меняет на больше, но когда я делаю меньше оно меньше не делает?

Добавлено через 5 минут
Еще эта функция не понятна shrink_to_fit(), она уменьшает capacity но меньше чем 30 в примере выше не делает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2013, 19:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Непонятные функции std::vector (C++):

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

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

Как передать целочисленную матрицу типа 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, классы и функции. - C++
Цель сделать вектор класса. Но в классе должен быть вектор. Обращения к элементам выглядит так, а как работать с вектором? #include...

39
metaluga145
15.05.2013, 20:03     Непонятные функции std::vector
  #16

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Кстати тоже не верное тут от реализации зависит, по крайней мере раньше был коэффициент 1.5
да. действительно. коэффициент 1.5. Только он начинает это делать с какого-то момента, который я не могу словить.

0
Avazart
Эксперт С++
7421 / 5511 / 316
Регистрация: 10.12.2010
Сообщений: 24,601
Записей в блоге: 17
15.05.2013, 20:04 #17
Цитата Сообщение от ninja2 Посмотреть сообщение
а я програл в визуал С++ у меня увеличивается на 50% от существовавшей.
Ну 1.5 и говорю же :
Цитата Сообщение от Avazart Посмотреть сообщение
тут от реализации зависит
0
ninja2
814 / 188 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.05.2013, 20:08  [ТС] #18
Цитата Сообщение от Avazart Посмотреть сообщение
Не надо ляля... книг достаточно ...
Да я читал в книге там говорилось в два раза увеличивается, но я тогда когда читал думал почему то что размер должен увеличиваться size().
Все таки правда от реализации зависит.

А capacity походу только полезна для функции push_back(), потому что я от пробовал при size() = 0 и capacity() = 10 обратиться к элементам вектора через oparetor[] и у меня ошибка вылезла.

Добавлено через 2 минуты
От видите господа разобрался capacity это как бы резерв, а я про это даже думать не мог, когда читал я думал capacity это просто объем всего вектора то есть sizeoff
0
Avazart
Эксперт С++
7421 / 5511 / 316
Регистрация: 10.12.2010
Сообщений: 24,601
Записей в блоге: 17
15.05.2013, 20:11 #19
capacity() reserve() - полезны для оптимизации конкретной задачи, к примеру когда ты знаешь что у тебя стабильно будет 50 ... 100 элементов и "резервируешь заранее массив" что бы в дальнейшем перераспределение было менее вероятным, а значит требовало меньше ресурсов.
0
0x10
2528 / 1708 / 258
Регистрация: 24.11.2012
Сообщений: 4,276
15.05.2013, 20:12 #20
Цитата Сообщение от ninja2 Посмотреть сообщение
А capacity походу только полезна для функции push_back(), потому что я от пробовал при size() = 0 и capacity() = 10 обратиться к элементам вектора через oparetor[] и у меня ошибка вылезла.
При обращении к n-ному элементу вектора в случае если size <= n - неопределенное поведение. Написано, кстати, тут http://www.cplusplus.com/reference/vector/vector/operator[]/

Цитата Сообщение от ninja2 Посмотреть сообщение
я думал capacity это просто объем всего вектора то есть sizeoff
Объем - sizeof? А что такое sizeof и из чего он складывается? А можно ли реализовать вектор, sizeof объектов которого был бы равен четырем (например)?
0
Croessmah
15.05.2013, 20:14
  #21

Не по теме:

Ну да, STL вещь не большая. И без разницы, что в стандарте ее описание занимает кучу страниц текста

1
Avazart
Эксперт С++
7421 / 5511 / 316
Регистрация: 10.12.2010
Сообщений: 24,601
Записей в блоге: 17
15.05.2013, 20:16 #22
Цитата Сообщение от 0x10 Посмотреть сообщение
При обращении к n-ному элементу вектора в случае если size < n - неопределенное поведение. Написано, кстати, тут
Ну скорее всего в дебаге ошибка, в релизе - может и не быть...
1
ninja2
814 / 188 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.05.2013, 20:19  [ТС] #23
Цитата Сообщение от 0x10 Посмотреть сообщение
Объем - sizeof? А что такое sizeof и из чего он складывается? А можно ли реализовать вектор, sizeof объектов которого был бы равен четырем (например)?
Отвечу сходу без тестов sizeof это объем объекта в байтах от допустим int b; sizeof(b) будет 8 байт выведет 8
Ну в принципе я думаю если протестить для примера вектор vector<int> у которого size()= 0, а capacity()= 10 , то я думаю sizeof() для этого вектора выведет 10 * 8 , то есть 80 байт. Просто оно зарезервировано и есть в объекте хотя и без доступа. Ну это если подумать.
0
0x10
2528 / 1708 / 258
Регистрация: 24.11.2012
Сообщений: 4,276
15.05.2013, 20:21 #24
Цитата Сообщение от ninja2 Посмотреть сообщение
Ну в принципе я думаю если протестить для примера вектор vector<int> у которого size()= 0, а capacity()= 10 , то я думаю sizeof() для этого вектора выведет 10 * 8 , то есть 80 байт
Вот пока есть такие ответы, я и буду настаивать на том, что нужно вручную реализовать все основные контейнеры и алгоритмы, понять как оно внутри и собрать хоть какой-то миниум граблей.
1
ninja2
814 / 188 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.05.2013, 20:25  [ТС] #25
0x10, ну я там ошибся 4 байта int весит. 40 байт будет щас еще протестю.
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
15.05.2013, 20:27 #26
Цитата Сообщение от ninja2 Посмотреть сообщение
Отвечу сходу без тестов sizeof это объем объекта в байтах
В char'ах. char в подавляющем большинстве случаев 1 байт, но не обязательно.
1
0x10
2528 / 1708 / 258
Регистрация: 24.11.2012
Сообщений: 4,276
15.05.2013, 20:29 #27
ninja2, еще код для размышлений
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> v;
    v.resize(100);
    v.reserve(400);
    std::cout << sizeof(v) << std::endl;
 
    return 0;
}
1
ninja2
814 / 188 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.05.2013, 20:32  [ТС] #28
0x10, 20 выводит почему то хотя должно по идее 40 вывести ведь в векторе место под 10 int должно резервироваться, что то короче не так.
C++
1
2
3
4
5
6
7
    vector<int> v;
    cout <<v.size()<<' '<<v.capacity()<<endl;
    v.reserve(10);
    cout <<v.size()<<' '<<v.capacity()<<endl;
    cout <<sizeof(v)<<endl;//20
    vector<int> v1(10);
    cout <<sizeof(v1)<<endl;//20
Что же тогда получается если у меня int занимает 4 байта, а тут 10 int у меня всего навсего 20 байт ?
0
0x10
2528 / 1708 / 258
Регистрация: 24.11.2012
Сообщений: 4,276
15.05.2013, 20:33 #29
Ну на самом деле для наглядности вывести sizeof объекта можно еще и до махинаций с размером/емкостью. Ну да не в этом суть.

Добавлено через 1 минуту
ninja2, потому и задаю вопрос: а как бы Вы реализовали динамический массив внутри? И как разрулили бы ситуацию, когда size == 16, capacity == 16 и мы пытаемся добавить еще один элемент в массив?
1
Avazart
Эксперт С++
7421 / 5511 / 316
Регистрация: 10.12.2010
Сообщений: 24,601
Записей в блоге: 17
15.05.2013, 20:36 #30
Цитата Сообщение от ninja2 Посмотреть сообщение
Что же тогда получается если у меня int занимает 4 байта, а тут 10 int у меня всего навсего 20 байт ?
По тому что sizeof не показывает размер контейнера, он о массиве сидящем внутри него ничего не знает.
1
15.05.2013, 20:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2013, 20:36
Привет! Вот еще темы с ответами:

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

Нужна реализация функции std::vector::insert() - C++
Нужна реализация функции std::vector::insert() 1)iterator insert (iterator position, const value_type&amp; val); 2) void insert (iterator...

Передать std::vector в качестве аргумента функции - C++
Задание: определить моду чисел из массива. Вот код: #include &lt;iostream&gt; #include &lt;vector&gt; int mod_a(int, vector&lt;int&gt;); using...

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


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

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

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