Изменение размера вектора
Слышал, что если делать в вектор push_back , то если у него не хватает внутреннего буфера, то он увеличивается в 1.5 раза. Правда ли? Будет ли тоже самое происходить когда я буду делать последовательно resize :
for(int i=0; i
Написал код, который сравнивает время исполнения каждой из версий. Вторая получается немного медленнее.
#include #include #include using namespace std; int main() < const int N = 10000000; clock_t tStart; vectora; tStart = clock(); for(int i=0; i
Пример вывода на ideone:
Time taken: 0.0649 sec Time taken: 0.0692 sec
Отслеживать
задан 18 мая 2017 в 14:49
2,558 1 1 золотой знак 16 16 серебряных знаков 32 32 бронзовых знака
Не совсем правда — это нигде не прописано, но разные реализации используют различные коэффициенты увеличения размера, при нехватке места в текущем выделенном пространстве. Все известные мне реализации увеличивают размер на число большее, чем требуется для одной операции помещения в контейнер.
18 мая 2017 в 18:21
При resize реализация скорее всего вмешиваться не будет и будет выделять ровно столько, сколько попросили. resize и reserve в цикле является пессимизацией и ошибкой.
18 мая 2017 в 18:24
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Лучше для добавления элементов брать не vector, а list или unordered_set. Вектор хорошо удаляет и добавляет элементы только в конец. В остальных случаях на сколько-то больших данных вектор начинает двигать элементы и это может плохо сказаться на производительности. Можно конечно не передвигать при удалении, но тогда нарушается порядок элементов.
Вектор может выигрывать на малых тестах, но это пока в кэш данные влезут. Если вектор 10-100 малых элементов, то он быстрее будет, а может и нет, это от очень многих факторов зависит.
Вобщем есть дофига вариаций, когда что быстрее.
Можно запустить вот это и узнать что происходит с вектором.
for(int i=0; i
В одной онлайн IDE
b.resize(i+1); b[i] = i;
Два раза присваивается значение сначала 0 потом цифра наверное поэтому дольше.
vector::size в C++ (с примерами)
Привет! Сегодня мы погрузимся в удивительный мир C++ и рассмотрим удобную функцию контейнера std::vector — функцию size . Начнем с краткого обзора и продемонстрируем её использование на простых примерах.
Получение количества элементов в векторе в C++
Если представить std::vector как коробку, в которой вы можете хранить и организовывать свои данные, то функция size просто сообщает вам, сколько элементов находится в этой коробке.
Вот базовая сигнатура функции size :
size_type size() const;
- Она ничего не принимает.
- Возвращает размер вектора в виде числа. Это число имеет тип size_type , что является разновидностью беззнакового числа.
Представьте, что у вас есть коробка ( std::vector ), и вы хотите узнать, насколько она заполнена. Вот как это сделать:
#include #include int main() std::vectorint> my_numbers; std::cout <"В коробке: " . size() <" элементов." :: endl; return 0; >
При запуске вы получите:
В коробке: 0 элементов.
Почему ноль? Потому что мы только что создали коробку и ничего в неё не положили!
Заполним нашу коробку:
Векторы в C++ динамичны. Вы можете добавлять и удалять элементы. При внесении этих изменений функция size помогает отслеживать количество элементов.
Вот короткий пример:
#include #include int main() std::vectorint> my_numbers; for (int i = 0; i 10; i++) my_numbers.push_back(i); // Добавляем элементы в коробку. > std::cout <"Теперь в коробке: " . size() <" элементов." :: endl; return 0; >
Теперь в коробке: 10 элементов.
Когда это полезно?
Представьте, что вы работаете над игрой и у вас есть список (vector) игроков. Иногда игроки присоединяются, иногда уходят. Используя функцию size , вы всегда будете знать, сколько у вас сейчас игроков. Это может быть полезно для разделения игроков на команды, проверки наличия достаточного количества игроков для начала игры и многого другого.
Что следует помнить:
- Размер и емкость: size показывает, сколько элементов в векторе. Но у векторов есть также такое понятие как capacity , которое показывает, сколько он может вместить, прежде чем потребуется увеличение. Они не всегда совпадают!
- Быстро и надежно: Получение размера вектора выполняется очень быстро, независимо от количества элементов в нем. И это всегда безопасно — это не изменит вектор или элементы внутри.
- Исключений нет! Лучшая часть заключается в том, что эта функция не выдает ошибок или исключений. Это как задать вопрос и быть уверенным, что вы всегда получите ответ.
Некоторые интересные связанные функции:
- vector::capacity: Как уже упоминалось, это показывает, сколько ваш вектор может вместить, прежде чем потребуется расширение.
- vector::resize: Если вы хотите изменить размер вашего вектора (увеличить или уменьшить его), эта функция может вам помочь.
- vector::max_size: Хотите узнать максимальное количество элементов, которое может содержать ваш вектор? Используйте функцию max_size !
В заключение, понимание особенностей контейнера std::vector и его функций, таких как size , поможет вам в написании C++ программ. Независимо от того, только ли вы начали изучение или оттачиваете свои навыки, динамичный и универсальный характер векторов обязательно станет незаменимым инструментом в вашем программистском арсенале.
- Понимание функции size :
- Создайте std::vector типа string для хранения имен.
- Добавьте в этот вектор пять имен.
- Выведите на экран текущий размер вектора с помощью функции size .
- Удалите из вектора два имени.
- Снова выведите на экран текущий размер вектора.
- Сравнение size и capacity :
- Используя тот же std::vector имен из предыдущего задания, выведите на экран емкость вектора.
- Добавьте еще 10 имен в вектор.
- Выведите размер и емкость вектора после этих добавлений.
- Обсудите разницу между размером и емкостью на основе полученных результатов.
- Изучение других функций вектора:
- Используйте функцию resize , чтобы увеличить размер вашего вектора до 20 и инициализировать новые элементы именем “Вася Пупкин”.
- Выведите все элементы вектора.
- Используйте функцию max_size , чтобы вывести максимальное количество элементов, которое вектор может хранить.
- Подумайте о том, как функции resize и max_size могут быть полезны в разных ситуациях.
Читайте также
string::size в C++
C++ предлагает разнообразные инструменты для работы со строками, и одна из самых важных функций — это string::size. В этой статье мы подробно рассмотрим эту функцию, поймем, как она измеряет строки, и исс