Форум программистов, компьютерный форум 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 в примере выше не делает?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
15.05.2013, 19:30
  #2

Не по теме:

Есть дельное предложение: вместо того, чтобы документировать существующее, выбросить нафиг STL и написать ее с нуля, самому. Чтобы пришло настоящее понимание того, как устроены внутри структуры данных. Думается, если подход будет выбран верный, то такие вопросы со временем сами решатся.

Наводящий вопрос: как ты думаешь, что происходит когда ты вызываешь метод push_back?

Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
15.05.2013, 19:33     Непонятные функции std::vector #3
capacity показывает сколько элементов может содержать вектор в данный момент, то есть возвращается место выделенное под вектор переведенное в элементы
reserve(x) резервирует место так что бы вектор мог содержать, по крайней мере, x элементов. Если x <= capacity(), то ничего не происходит.

shrink_to_fit()
Допустим был вектор vector<int> v(100); //100 целых чисел. capacity() >= 100
Поменяем размер: v.resize(10); //10 целых чисел. capacity() >= 100
v.shrink_to_fit(); //10 целых чисел. capacity() >= 10
ninja2
15.05.2013, 19:34  [ТС]
  #4

Не по теме:

0x10, Да нет дружище, твое предложение меня отталкнет далеко назад, а я хо быстрее покончить с стл и начать учить винапи.

Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
15.05.2013, 19:35     Непонятные функции std::vector #5
Но зачем всё это документировать если есть полно ресурсов по С++?
metaluga145
15.05.2013, 19:37
  #6

Не по теме:

Цитата Сообщение от ninja2 Посмотреть сообщение
начать учить винапи.
зачем учить винапи,если не понимаешь базы?

ninja2
15.05.2013, 19:37  [ТС]
  #7

Не по теме:

Цитата Сообщение от 0x10 Посмотреть сообщение
Наводящий вопрос: как ты думаешь, что происходит когда ты вызываешь метод push_back?
Я думаю создается новая ячейка с размером который был раньше только плюс один.

metaluga145
15.05.2013, 19:39
  #8

Не по теме:

Цитата Сообщение от ninja2 Посмотреть сообщение
Я думаю создается новая ячейка с размером который был раньше только плюс один.
гг. а вот и нет

ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.05.2013, 19:44  [ТС]     Непонятные функции std::vector #9
Цитата Сообщение от Olivеr Посмотреть сообщение
Но зачем всё это документировать если есть полно ресурсов по С++?
Мне они не нравятся те, что есть да на английском сplacplac хороший ресурс, но там фиг, что разберешь. А так если хорошо задокументировать, да еще понятным для себя языком, то в будущем с экономится очень много времени.

Времени много тратиться в гугле набрать, а затем ищи на русском, а там бывает выкидывает ссылки не те что тебе нужно.

А так когда сам задокументировал стл изучу на приличном уровне она ж не большая. Да и если, что то призабуду искать долго не придется зашол посмотрел сделал.
Да практика это хорошая

Лучший способ запомнить новый материал - это написать шпаргалку .
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
15.05.2013, 19:44     Непонятные функции std::vector #10
ninja2, наводяший код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> v;
    for (int i = 0; i < 1000; ++i)
    {
        v.push_back(i);
        std::cout << v.size() << " " << v.capacity() << std::endl;
    }
    return 0;
}
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
15.05.2013, 19:44     Непонятные функции std::vector #11
метод push_back заказывает память, в двое больше,чем надо. то есть к каписити+1 и к размеру +1
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
15.05.2013, 19:45     Непонятные функции std::vector #12
Цитата Сообщение от ninja2 Посмотреть сообщение
Лучший способ запомнить новый материал
Понимать > Помнить
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
15.05.2013, 19:59     Непонятные функции std::vector #13
Цитата Сообщение от ninja2 Посмотреть сообщение
что поймешь, а русских ресурсов мало, поэтому решил свой ресурс создать по стл.
Не надо ляля... книг достаточно ...

Добавлено через 2 минуты
Цитата Сообщение от metaluga145 Посмотреть сообщение
метод push_back заказывает память, в двое больше,чем надо. то есть к каписити+1 и к размеру +1
Кстати тоже не верное тут от реализации зависит, по крайней мере раньше был коэффициент 1.5

Добавлено через 2 минуты
Цитата Сообщение от ninja2 Посмотреть сообщение
Что такое capacity() это мощьность, а что за мощьность?
-Ёмкость.
Реальный размер "внутреннего" массива сидящего в контейнере.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
15.05.2013, 19:59     Непонятные функции std::vector #14
Цитата Сообщение от Avazart Посмотреть сообщение
Кстати тоже не верное тут от реализации зависит, по крайней мере раньше был коэффициент 1.5
Ну я сейчас прогнал код выше - capacity при необходимости увеличивается в два раза, gcc 4.7.2.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.05.2013, 20:02  [ТС]     Непонятные функции std::vector #15
Цитата Сообщение от 0x10 Посмотреть сообщение
Ну я сейчас прогнал код выше - capacity при необходимости увеличивается в два раза, gcc 4.7.2.
а я програл в визуал С++ у меня увеличивается на 50% от существовавшей.
metaluga145
15.05.2013, 20:03
  #16

Не по теме:

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

Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
15.05.2013, 20:04     Непонятные функции std::vector #17
Цитата Сообщение от ninja2 Посмотреть сообщение
а я програл в визуал С++ у меня увеличивается на 50% от существовавшей.
Ну 1.5 и говорю же :
Цитата Сообщение от Avazart Посмотреть сообщение
тут от реализации зависит
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.05.2013, 20:08  [ТС]     Непонятные функции std::vector #18
Цитата Сообщение от Avazart Посмотреть сообщение
Не надо ляля... книг достаточно ...
Да я читал в книге там говорилось в два раза увеличивается, но я тогда когда читал думал почему то что размер должен увеличиваться size().
Все таки правда от реализации зависит.

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

Добавлено через 2 минуты
От видите господа разобрался capacity это как бы резерв, а я про это даже думать не мог, когда читал я думал capacity это просто объем всего вектора то есть sizeoff
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
15.05.2013, 20:11     Непонятные функции std::vector #19
capacity() reserve() - полезны для оптимизации конкретной задачи, к примеру когда ты знаешь что у тебя стабильно будет 50 ... 100 элементов и "резервируешь заранее массив" что бы в дальнейшем перераспределение было менее вероятным, а значит требовало меньше ресурсов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2013, 20:12     Непонятные функции std::vector
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
15.05.2013, 20:12     Непонятные функции std::vector #20
Цитата Сообщение от ninja2 Посмотреть сообщение
А capacity походу только полезна для функции push_back(), потому что я от пробовал при size() = 0 и capacity() = 10 обратиться к элементам вектора через oparetor[] и у меня ошибка вылезла.
При обращении к n-ному элементу вектора в случае если size <= n - неопределенное поведение. Написано, кстати, тут http://www.cplusplus.com/reference/v...ector/operator[]/

Цитата Сообщение от ninja2 Посмотреть сообщение
я думал capacity это просто объем всего вектора то есть sizeoff
Объем - sizeof? А что такое sizeof и из чего он складывается? А можно ли реализовать вектор, sizeof объектов которого был бы равен четырем (например)?
Yandex
Объявления
15.05.2013, 20:12     Непонятные функции std::vector
Ответ Создать тему
Опции темы

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