Класс vector. Методы, определяющие и изменяющие общие характеристики массива
Тема есть продолжением темы:
Содержание
- 1. Метод size(). Определить размер вектора
- 2. Метод max_size(). Максимально-допустимый размер массива
- 3. Метод capacity(). Определить размер массива с учетом зарезервированной памяти
- 4. Метод empty(). Определить, пустой ли вектор
- 5. Метод shrink_to_fit(). Установить размер массива в памяти по количеству элементов в нем без дополнительного резервирования памяти
- 6. Метод resize(). Изменить размер массива
- 7. Метод reserve(). Зарезервировать дополнительную память для элементов массива
- Связанные темы
Поиск на других ресурсах:
1. Метод size(). Определить размер вектора
Текущее количество элементов в динамическом массиве vector можно определить с помощью метода size(). Синтаксис объявления метода size() следующий
size_t vector<T>::size() const
здесь T – тип элементов массива.
Пример.
// Некоторый класс class MyClass { // ... }; ... // Метод size() // 1. Создать вектор из 5 чисел типа int и получить его размер vector<int> A1(5); int n1 = A1.size(); // n1 = 5 // 2. Создать вектор из 10 экземпляров типа MyClass и получить его размер vector<MyClass> A2(10); int n2 = A2.size(); // n2 = 10 // 3. Создать пустой вектор типа bool и получить его размер vector<bool>* A3 = new vector<bool>(); // создать через указатель int n3 = A3->size(); // n3 = 0 ...
⇑
2. Метод max_size(). Максимально-допустимый размер массива
Метод max_size() позволяет получить максимально-допустимое количество элементов массива. Это значение зависит от типа элементов массива vector. Для различных типов оно разное
В зависимости от типа данных массива vector, это значение может колебаться. Чем больше размер данных каждого элемента массива vector, тем меньше значение max_size().
Синтаксис объявления метода max_size() следующий:
size_t vector<T>::max_size() const
здесь T – тип элементов динамического массива.
Пример.
... // Некоторый класс class Complex { public: double re; double im; // ... }; ... // Метод max_size() // 1. Создать вектор из 5 чисел типа int и получить его максимально-допустимый размер vector<int> A1(5); int max1 = A1.max_size(); // max1 = 1073741823 // 2. Создать вектор из 10 экземпляров типу Complex // и получить его максимально-допустимый размер vector<Complex> A2(10); int max2 = A2.max_size(); // max2 = 268435455 // 3. Создать пустой вектор типа bool и получить его максимально-допустимый размер vector<bool>* A3 = new vector<bool>(); // создать через указатель int max3 = A3->max_size(); // max3 = 2147483647 cout << max3 << endl; ...
⇑
3. Метод capacity(). Определить размер массива с учетом зарезервированной памяти
Метод capacity() возвращает количество элементов, выделенное для массива.
При добавлении нового элемента в массив, нужно выделить дополнительную память на 1 элемент больше. Однако, компилятор может увеличить размер памяти на несколько элементов чтобы при последующем добавлении еще одного элемента не выполнять повторно такие операции как освобождение памяти под предварительно созданный массив, выделение нового фрагмента и тому подобное. Таким образом ускоряется быстродействие.
Синтаксис объявления метода следующий
size_t vector<T>::capacity<T> const
здесь T – тип элементов массива.
Пример. В примере демонстрируется разница между методами size() и capacity().
#include <iostream> #include <vector> using namespace std; void main() { // Метод capacity() // Создать массив из 10 элементов типа float vector<float> A1(10); // Вывести реальное количество элементов массива int capacity = A1.capacity(); int size = A1.size(); cout << "A1.capacity() = " << capacity << endl; cout << "A1.size() = " << size << endl; // Добавить 1 элемент в конец массива A1.push_back(5); cout << "+1 item" << endl; // Вывести новые значения количества элементов в массиве capacity = A1.capacity(); size = A1.size(); cout << "A1.capacity() = " << capacity << endl; // 15 cout << "A1.size() = " << size << endl; // 11 }
Результат выполнения программы
A1.capacity() = 10 A1.size() = 10 +1 item A1.capacity() = 15 A1.size() = 11
Как видно из результата, при добавлении нового элемента, количество элементов в массиве увеличилась на 1 и составляет 11 (метод size()). Однако, сам размер массива увеличился на 5 элементов и составляет 15 (метод capacity()). Теперь можно добавлять еще 4 элемента без лишнего перераспределения памяти. Если добавление элементов будет выполняться в цикле, то такой подход позволит ускорить выполнение программы.
⇑
4. Метод empty(). Определить, пустой ли вектор
С помощью метода empty() можно определить, пустой ли массив (количество элементов в массиве равно 0). Общая форма метода empty() следующая:
bool vector<T> empty() const
здесь T – тип элементов массива.
Пример.
#include <iostream> #include <vector> using namespace std; void main() { // Метод empty() - определить, пустой ли вектор vector<double> A(5); // Создать массив из 5 элементов // Проверка, пустой ли массив if (A.empty()) cout << "Vector A is empty." << endl; else cout << "Vector A is not empty." << endl; // Очистить массив A.clear(); // Еще раз проверить, пустой ли массив if (A.empty()) cout << "Vector A is empty." << endl; else cout << "Vector A is not empty." << endl; }
Результат выполнения программы
Vector A is not empty. Vector A is empty.
⇑
5. Метод shrink_to_fit(). Установить размер массива в памяти по количеству элементов в нем без дополнительного резервирования памяти
Метод shrink_to_fit() позволяет выровнять память, выделенную (зарезервированную) для элементов массива (метод capacity()) с памятью, занятой элементами массива (метод size()).
Количество зарезервированных элементов (для которых выделена память) возвращается методом capacity(). Количество элементов, определенных в массиве, возвращаются методом size(). Значение, возвращаемое методом capacity() всегда больше или равно значения, возвращаемого методом size().
Если значение, полученное методом capacity() больше значения, полученного методом size(), то метод shrink_to_fit() позволяет выровнять эти значения. При этом уменьшается размер памяти, возвращаемый методом capacity().
Метод эффективен, когда в результате различных операций с массивом, остается большой избыток зарезервированных элементов в массиве.
Общая форма метода следующая
void shrink_to_fit()
После вызова этого метода, методы size() и capacity() всегда будут возвращать одинаковые значения.
Пример.
#include <iostream> #include <vector> using namespace std; void main() { // Метод shrink_to_fit() - изменить значение зарезервированной памяти для массива // 1. Создать массив целых чисел на основе списка инициализации initializer_list<int> L = { 1, 2, 3, 4, 5 }; vector<int> A1(L); // 2. Вывести количество элементов, для которых уже распределена память cout << "Allocated size = " << A1.capacity() << endl; // 5 // 3. Вывести текущее количество элементов cout << "Size = " << A1.size() << endl; // 5 // 4. Прибавить к массиву 1 элемент A1.push_back(6); cout << "+1 item" << endl; // 5. Еще раз вывести распределенное количество элементов // и текущее количество элементов cout << "Allocated size = " << A1.capacity() << endl; // 7 cout << "Size = " << A1.size() << endl; // 6 // 6. Выровнять распределенное количество с текущим количеством A1.shrink_to_fit(); cout << "shrink_to_fit()" << endl; // 7. Повторно вывести распределенное и фактическое количество элементов cout << "Allocated size = " << A1.capacity() << endl; // 6 cout << "Size = " << A1.size() << endl; // 6 }
Результат выполнения программы
Allocated size = 5 Size = 5 +1 item Allocated size = 7 Size = 6 shrink_to_fit() Allocated size = 6 Size = 6
Как видно из результата, после добавления элемента в массив, размер массива увеличился с 5 до 6. Это естественно и метод size() это показал. Но реальный размер массива увеличился с 5 до 7, о чем показал метод capacity(). То есть, выделилось на 1 элемент больше.
Вызов метода shrink_to_fit() перераспределил память так, что количество выделенной памяти под элементы стала равна количеству памяти, занятой элементами.
⇑
6. Метод resize(). Изменить размер массива
Метод resize() позволяет изменять размер динамического массива в большую или в меньшую сторону. Метод имеет две перегруженные реализации.
Первая реализация имеет следующее объявление
void resize(const size_t _NewSize)
здесь
- _NewSize – новый размер массива. Если _NewSize больше текущего размера массива, то все остальные элементы дополняются нулевыми значениями.
Вторая реализация имеет следующее объявление
void resize(const size_t _NewSize, const T& Val)
здесь
- _NewSize – новый размер массива;
- T – тип элементов массива;
- Val — значения, которыми дополняются элементы массива в случае, если значение _NewSize больше текущего размера.
Пример.
... // Метод resize() - изменить размер массива // 1. Создать массив целых чисел на основе списка инициализации initializer_list<int> L = { 1, 2, 3, 4, 5 }; vector<int> A1(L); // 2. Изменить размер массива A1 A1.resize(8); // A1 = { 1, 2, 3, 4, 5, 0, 0, 0 } // 3. Уменьшить размер массива A1 с заполнением значениями 10 A1.resize(6, 10); // A1 = { 1, 2, 3, 4, 5, 0 } // 4. Увеличить размер массива A1 с заполнением значениями 15 A1.resize(9, 15); // A1 = { 1, 2, 3, 4, 5, 0, 15, 15, 15 } ...
⇑
7. Метод reserve(). Зарезервировать дополнительную память для элементов массива
Метод reserve() позволяет выделить (зарезервировать) память для элементов массива, которая возвращается методом capacity(). Реальное количество элементов в массиве, которое возвращается методом size(), не изменяется.
Правильное использование метода в программе позволяет ускорить выполнение программы в случаях, когда активно изменяется размер массива (часто выполняются операции добавления, удаления элементов из массива). Это осуществляется за счет уменьшения количества операций, связанных с перераспределением памяти.
Объявления метода следующее
void reserve(size_t Newcapacity)
здесь
- Newcapacity – новый размер массива с учетом зарезервированных элементов.
Пример.
#include <iostream> #include <vector> using namespace std; void main() { // Метод reserve() - зарезервировать дополнительную память для массива // 1. Объявить массив из 5 элементов типа float vector<float> A(5); // 2. Вывести количество элементов массива и зарезервированное количество cout << A.size() << endl; // 5 cout << A.capacity() << endl; // 5 // 3. Зарезервировать дополнительную память для массива A.reserve(12); // 4. Вывести количество элементов массива и зарезервировано место для элементов массива cout << A.size() << endl; // 5 cout << A.capacity() << endl; // 12 }
Результат выполнения программы
5 5 5 12
⇑
Связанные темы
- Общие сведения о классе vector. Обзор методов. Создание динамического массива. Способы доступа к элементам вектора
- Методы, изменяющие данные в массиве. Методы push_back(), pop_back(), clear(), swap(), operator=(), erase(), insert(), assign()
- Методы, обеспечивающие доступ к элементам массива: at(), front(), back(), data(), begin(), end(), cbegin(), cend(), rbegin(), rend(), crbegin(), crend()
⇑