Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041

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

15.05.2013, 19:21. Показов 4277. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.05.2013, 19:21
Ответы с готовыми решениями:

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

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

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

39
15.05.2013, 20:14
Студворк — интернет-сервис помощи студентам

Не по теме:

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

1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.05.2013, 20:16
Цитата Сообщение от 0x10 Посмотреть сообщение
При обращении к n-ному элементу вектора в случае если size < n - неопределенное поведение. Написано, кстати, тут
Ну скорее всего в дебаге ошибка, в релизе - может и не быть...
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
15.05.2013, 20:19  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Объем - sizeof? А что такое sizeof и из чего он складывается? А можно ли реализовать вектор, sizeof объектов которого был бы равен четырем (например)?
Отвечу сходу без тестов sizeof это объем объекта в байтах от допустим int b; sizeof(b) будет 8 байт выведет 8
Ну в принципе я думаю если протестить для примера вектор vector<int> у которого size()= 0, а capacity()= 10 , то я думаю sizeof() для этого вектора выведет 10 * 8 , то есть 80 байт. Просто оно зарезервировано и есть в объекте хотя и без доступа. Ну это если подумать.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
15.05.2013, 20:21
Цитата Сообщение от ninja2 Посмотреть сообщение
Ну в принципе я думаю если протестить для примера вектор vector<int> у которого size()= 0, а capacity()= 10 , то я думаю sizeof() для этого вектора выведет 10 * 8 , то есть 80 байт
Вот пока есть такие ответы, я и буду настаивать на том, что нужно вручную реализовать все основные контейнеры и алгоритмы, понять как оно внутри и собрать хоть какой-то миниум граблей.
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
15.05.2013, 20:25  [ТС]
0x10, ну я там ошибся 4 байта int весит. 40 байт будет щас еще протестю.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
15.05.2013, 20:27
Цитата Сообщение от ninja2 Посмотреть сообщение
Отвечу сходу без тестов sizeof это объем объекта в байтах
В char'ах. char в подавляющем большинстве случаев 1 байт, но не обязательно.
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
15.05.2013, 20:29
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
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
15.05.2013, 20:32  [ТС]
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
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
15.05.2013, 20:33
Ну на самом деле для наглядности вывести sizeof объекта можно еще и до махинаций с размером/емкостью. Ну да не в этом суть.

Добавлено через 1 минуту
ninja2, потому и задаю вопрос: а как бы Вы реализовали динамический массив внутри? И как разрулили бы ситуацию, когда size == 16, capacity == 16 и мы пытаемся добавить еще один элемент в массив?
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.05.2013, 20:36
Цитата Сообщение от ninja2 Посмотреть сообщение
Что же тогда получается если у меня int занимает 4 байта, а тут 10 int у меня всего навсего 20 байт ?
По тому что sizeof не показывает размер контейнера, он о массиве сидящем внутри него ничего не знает.
1
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
15.05.2013, 20:37
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
В char'ах. char в подавляющем большинстве случаев 1 байт, но не обязательно.
Упс, таки в байтах. Это просто char'ы особенные.
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
15.05.2013, 20:37
Цитата Сообщение от ninja2 Посмотреть сообщение
Что же тогда получается если у меня int занимает 4 байта, а тут 10 int у меня всего навсего 20 байт ?
На сам вектор, как объект, выделяется 20 байт (в GCC 24 байта), а выделенная память под данные считается так:
C++
1
2
vector<int> v(20);
cout << v.capacity() * sizeof(int);
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
15.05.2013, 20:40  [ТС]
0x10, Ну я понял тоже 20 выводит, значит что? Это значит что просто в объекте vector может находится допустим 5 членов int* или два чара и один int, что бы в сумме было 20 байт. Ведь объем объекта измеряется объемом его членов (методы ничего не весят).

Да значит реальный объем вектора, чтобы посчитать то нужно capacity()*4 или как? Или это не нужно?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
15.05.2013, 20:40
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Упс, таки в байтах.
По-моему, все-таки в чарах, просто по стандарту sizeof(char) == 1. Но могу загонять, да.

Не по теме:

Но если честно, расстановки точек над ё в конкретно этом вопросе мне кажутся занудством. =)

1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
15.05.2013, 20:42  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
ninja2, потому и задаю вопрос: а как бы Вы реализовали динамический массив внутри? И как разрулили бы ситуацию, когда size == 16, capacity == 16 и мы пытаемся добавить еще один элемент в массив?
Я бы просто заново выделил память +1 new() перекопировал в эту память старые элементы и там уже будет место под еще один и туда добавил новый. Я уже реализовывал свой вектор и так делал.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.05.2013, 20:45
Цитата Сообщение от ninja2 Посмотреть сообщение
Я бы просто заново выделил память +1 new() перекопировал в эту память старые элементы и там уже будет место под еще один и туда добавил новый. Я уже реализовывал свой вектор и так делал.
Невыгодно каждый раз из-за одного элемента делать перераспределение памяти, сильно дорогостоющее удовольствие в плане скорости, особенно если вектор постоянно растет.

Но тем не менее все зависит от конкретной задачи... а коэффициент 1.5...2 это для среднестатистического случая.
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
15.05.2013, 20:51
Собственно, главное, что я хотел услышать - это слово new. Т.е. понимаем, что в качестве поля класса будем хранить указатель. А его sizeof ну никак не равен размеру всех элементов, память под которые выделена с помощью new[].
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
15.05.2013, 20:54  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Но тем не менее все зависит от конкретной задачи... а коэффициент 1.5...2 это среднестатистический случай.
Ну да мне б ничего не стоило б увеличить и в 4 раза, токо как бы мне б ее резервировать? Наверно пришлось два size хранить в векторе один для резерва, а второй для реально доступных элементов, ну это как пример реализации резервирования.

Добавлено через 2 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
Собственно, главное, что я хотел услышать - это слово new. Т.е. понимаем, что в качестве поля класса будем хранить указатель. А его sizeof ну никак не равен размеру всех элементов, память под которые выделена с помощью new[].
Ну да
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.05.2013, 20:55
Цитата Сообщение от ninja2 Посмотреть сообщение
Наверно пришлось два size хранить в векторе один для резерва
Ну так и есть size() и capacity()
А для изменения resize() и reserve()
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
15.05.2013, 20:58
Цитата Сообщение от ninja2 Посмотреть сообщение
Наверно пришлось два size хранить в векторе один для резерва, а второй для реально доступных элементов
Лезем в исходники и видим, что там действительно не происходит ничего более умного:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
/**  Returns the number of elements in the %vector.  */
size_type
size() const _GLIBCXX_NOEXCEPT
{ return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }
 
/**
 *  Returns the total number of elements that the %vector can
 *  hold before needing to allocate more memory.
 */
size_type
capacity() const _GLIBCXX_NOEXCEPT
{ return size_type(this->_M_impl._M_end_of_storage
                   - this->_M_impl._M_start); }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.05.2013, 20:58

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

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

std::vector, классы и функции.
Цель сделать вектор класса. Но в классе должен быть вектор. Обращения к элементам выглядит так, а как работать с вектором? #include...

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru