Вектор хранит элементы в виде линейного массива – потому обращаться к его элементам можно не только по итераторам и/или с использованием at() или operator[], но и просто по указателю, как к обычному массиву. Но, как я уже сказал выше, в отличие от обычных массивов, в вектор можно добавлять или удалять данные, т. е. менять количество элементов в массиве.
Когда использовать vector?
Vector стоит использовать если :
- есть необходимость обращаться к элементам массива по их номеру (индексу) –
Std::vector
- позволяет делать это практически без потерь скорости. последовательно обрабатывать (или посматривать) элементы массива – аналогично, вектор оптимизирован для таких операций и существенной разницы с обычными массивами наблюдаться не будет. добавление элементов в ваш массив будет происходить только в конец массива, тогда скажутся те самые оптимизации, о которых я писал выше и скорость будет почти равна обычным массивам вообще вектор это хорошая замена обычным массивам – обычно скорость работы std::vector не ниже, а качество кода при этом заметно выше
Vector vs. массив
В общем, если проводить параллели с обычным массивом, то Vector будет иметь примерно такую же скорость (чуть-чуть медленнее местами, но не существенно), но зато в вектор можно добавлять элементы, не задумываясь есть ли место для их размещения (при разумном количестве добавляемых элементов, конечно же), он сам подчистит за собой память, когда вы перестанете его использовать и он (в режиме отладки) будет проверять что вы случайно не вышли за пределы массива (например, если вы пытаетесь получить 100ый элемент из массива, где всего 90 элементов). Последний пункт, кстати, особенно важен и позволяет отловить достаточно большое количество багов, которые иначе могли бы жить в программе месяцами.
Недостатки std::vector
Но у Std::vector есть и некоторые недостатки, по сравнению с обычными массивами: обычно он чуть-чуть медленнее (но это не повод его не использовать!!!!) и он требует немного больше памяти, чем обычные массивы (поскольку обычно резервирует память для быстрой вставки новых элементов).
Как правило, следует заранее обдумывать то, какие элементы и в каком количестве будут храниться в std::vector. Если Вы планируете часто добавлять в него данные, то имеет смысл зарезервировать некоторый объём памяти заранее – тогда vector::push_back и прочие операции будут работать быстрее, т. к. им не придётся постоянно выделять память. Естественно, вектор старается оптимизировать количество выделений памяти, но если Вы так же задумаетесь об этом – хуже-то точно не станет.
Кроме того, не забывайте, что std::vector может расширять количество потребляемой им памяти, но он никогда не уменьшает её. Из этого следует, что если вы добавите в вектор, скажем, миллион объектов, а потом удалите их из него – вектор по прежнему будет потреблять столько памяти, сколько требовалось для хранения того самого миллиона объектов. Для того, что бы освободить эту память – придётся приложить некоторые усилия. Обычно это называют “фокус с перестановкой std::vector”:
Похожие записи: