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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.05.2013, 19:21     Непонятные функции std::vector #1
Здорова господа!
Тут я решил своими словами описать стандартные контейнеры их всего 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 в примере выше не делает?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
15.05.2013, 20:14     Непонятные функции std::vector
  #21

Не по теме:

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
15.05.2013, 20:16     Непонятные функции std::vector #22
Цитата Сообщение от 0x10 Посмотреть сообщение
При обращении к n-ному элементу вектора в случае если size < n - неопределенное поведение. Написано, кстати, тут
Ну скорее всего в дебаге ошибка, в релизе - может и не быть...
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.05.2013, 20:19  [ТС]     Непонятные функции std::vector #23
Цитата Сообщение от 0x10 Посмотреть сообщение
Объем - sizeof? А что такое sizeof и из чего он складывается? А можно ли реализовать вектор, sizeof объектов которого был бы равен четырем (например)?
Отвечу сходу без тестов sizeof это объем объекта в байтах от допустим int b; sizeof(b) будет 8 байт выведет 8
Ну в принципе я думаю если протестить для примера вектор vector<int> у которого size()= 0, а capacity()= 10 , то я думаю sizeof() для этого вектора выведет 10 * 8 , то есть 80 байт. Просто оно зарезервировано и есть в объекте хотя и без доступа. Ну это если подумать.
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
15.05.2013, 20:21     Непонятные функции std::vector #24
Цитата Сообщение от ninja2 Посмотреть сообщение
Ну в принципе я думаю если протестить для примера вектор vector<int> у которого size()= 0, а capacity()= 10 , то я думаю sizeof() для этого вектора выведет 10 * 8 , то есть 80 байт
Вот пока есть такие ответы, я и буду настаивать на том, что нужно вручную реализовать все основные контейнеры и алгоритмы, понять как оно внутри и собрать хоть какой-то миниум граблей.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.05.2013, 20:25  [ТС]     Непонятные функции std::vector #25
0x10, ну я там ошибся 4 байта int весит. 40 байт будет щас еще протестю.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
15.05.2013, 20:27     Непонятные функции std::vector #26
Цитата Сообщение от ninja2 Посмотреть сообщение
Отвечу сходу без тестов sizeof это объем объекта в байтах
В char'ах. char в подавляющем большинстве случаев 1 байт, но не обязательно.
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
15.05.2013, 20:29     Непонятные функции std::vector #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;
}
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.05.2013, 20:32  [ТС]     Непонятные функции std::vector #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 байт ?
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
15.05.2013, 20:33     Непонятные функции std::vector #29
Ну на самом деле для наглядности вывести sizeof объекта можно еще и до махинаций с размером/емкостью. Ну да не в этом суть.

Добавлено через 1 минуту
ninja2, потому и задаю вопрос: а как бы Вы реализовали динамический массив внутри? И как разрулили бы ситуацию, когда size == 16, capacity == 16 и мы пытаемся добавить еще один элемент в массив?
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
15.05.2013, 20:36     Непонятные функции std::vector #30
Цитата Сообщение от ninja2 Посмотреть сообщение
Что же тогда получается если у меня int занимает 4 байта, а тут 10 int у меня всего навсего 20 байт ?
По тому что sizeof не показывает размер контейнера, он о массиве сидящем внутри него ничего не знает.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
15.05.2013, 20:37     Непонятные функции std::vector #31
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
В char'ах. char в подавляющем большинстве случаев 1 байт, но не обязательно.
Упс, таки в байтах. Это просто char'ы особенные.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
15.05.2013, 20:37     Непонятные функции std::vector #32
Цитата Сообщение от ninja2 Посмотреть сообщение
Что же тогда получается если у меня int занимает 4 байта, а тут 10 int у меня всего навсего 20 байт ?
На сам вектор, как объект, выделяется 20 байт (в GCC 24 байта), а выделенная память под данные считается так:
C++
1
2
vector<int> v(20);
cout << v.capacity() * sizeof(int);
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.05.2013, 20:40  [ТС]     Непонятные функции std::vector #33
0x10, Ну я понял тоже 20 выводит, значит что? Это значит что просто в объекте vector может находится допустим 5 членов int* или два чара и один int, что бы в сумме было 20 байт. Ведь объем объекта измеряется объемом его членов (методы ничего не весят).

Да значит реальный объем вектора, чтобы посчитать то нужно capacity()*4 или как? Или это не нужно?
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
15.05.2013, 20:40     Непонятные функции std::vector #34
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Упс, таки в байтах.
По-моему, все-таки в чарах, просто по стандарту sizeof(char) == 1. Но могу загонять, да.

Не по теме:

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

ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.05.2013, 20:42  [ТС]     Непонятные функции std::vector #35
Цитата Сообщение от 0x10 Посмотреть сообщение
ninja2, потому и задаю вопрос: а как бы Вы реализовали динамический массив внутри? И как разрулили бы ситуацию, когда size == 16, capacity == 16 и мы пытаемся добавить еще один элемент в массив?
Я бы просто заново выделил память +1 new() перекопировал в эту память старые элементы и там уже будет место под еще один и туда добавил новый. Я уже реализовывал свой вектор и так делал.
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
15.05.2013, 20:45     Непонятные функции std::vector #36
Цитата Сообщение от ninja2 Посмотреть сообщение
Я бы просто заново выделил память +1 new() перекопировал в эту память старые элементы и там уже будет место под еще один и туда добавил новый. Я уже реализовывал свой вектор и так делал.
Невыгодно каждый раз из-за одного элемента делать перераспределение памяти, сильно дорогостоющее удовольствие в плане скорости, особенно если вектор постоянно растет.

Но тем не менее все зависит от конкретной задачи... а коэффициент 1.5...2 это для среднестатистического случая.
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
15.05.2013, 20:51     Непонятные функции std::vector #37
Собственно, главное, что я хотел услышать - это слово new. Т.е. понимаем, что в качестве поля класса будем хранить указатель. А его sizeof ну никак не равен размеру всех элементов, память под которые выделена с помощью new[].
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.05.2013, 20:54  [ТС]     Непонятные функции std::vector #38
Цитата Сообщение от Avazart Посмотреть сообщение
Но тем не менее все зависит от конкретной задачи... а коэффициент 1.5...2 это среднестатистический случай.
Ну да мне б ничего не стоило б увеличить и в 4 раза, токо как бы мне б ее резервировать? Наверно пришлось два size хранить в векторе один для резерва, а второй для реально доступных элементов, ну это как пример реализации резервирования.

Добавлено через 2 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
Собственно, главное, что я хотел услышать - это слово new. Т.е. понимаем, что в качестве поля класса будем хранить указатель. А его sizeof ну никак не равен размеру всех элементов, память под которые выделена с помощью new[].
Ну да
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
15.05.2013, 20:55     Непонятные функции std::vector #39
Цитата Сообщение от ninja2 Посмотреть сообщение
Наверно пришлось два size хранить в векторе один для резерва
Ну так и есть size() и capacity()
А для изменения resize() и reserve()
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2013, 20:58     Непонятные функции std::vector
Еще ссылки по теме:

Вывести значения std::vector<std::vector<int*> > C++
C++ Std::vector
Как изменять размер std::vector<std::vector>? C++

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

Или воспользуйтесь поиском по форуму:
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
15.05.2013, 20:58     Непонятные функции std::vector #40
Цитата Сообщение от 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); }
Yandex
Объявления
15.05.2013, 20:58     Непонятные функции std::vector
Ответ Создать тему
Опции темы

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