Это вторая статья посвященная векторам в языке программирования С++. Если вы не читали вводную статью по векторам, советую это сделать прямо сейчас. Итак, мы знаем как объявлять вектора, знаем какой заголовочный файл подключать и знаем некоторые методы для работы с векторами, все это мы узнали из предыдущей статьи. В этой статье я хочу показать вам еще несколько интересных методов для работы с векторами. Давайте сразу перейдем к практике:
#include <iostream> #include <vector> #include <iterator> using namespace std; int main() { int arraySize = 0; cout << "Введите размер массива: "; cin >> arraySize; vector<int> array(arraySize); cout << "Введите элементы массива: "; for(int i = 0; i < array.size(); i++) { cin >> array[i]; } cout << "\nВведенный массив: "; if (!array.empty()) { // если массив не пуст // вывод на экран элементов массива copy( array.begin(), array.end(), ostream_iterator<int>(cout," ") ); } cout << "\nКоличество элементов массива: " << array.size(); vector<int> array2 = array; // присвоил все элементы array массиву array2 cout << "\nЭлементы второго массива (скопированы из первого): "; copy( array2.begin(), array2.end(), ostream_iterator<int>(cout," ") ); cout << "\nПервый элемент массива array2: " << array2.front() << endl; cout << "Последний элемент массива array2: " << array2.back() << endl; array.clear(); // удалим все элементы массива, array теперь пуст array2.push_back(-11); // в конец массива array2 добавили новый элемент (-11) cout << "Массив array2 с новым последним элементом: "; copy( array2.begin(), array2.end(), ostream_iterator<int>(cout," ") ); return 0; }
Строки 8 — 16 должны быть вам понятны. Тут мы ничего сверхъестественно не делаем, просто объявляем массив. Обратите внимание, что когда я говорю массив, я подразумеваю вектор. На функциональном уровне восприятия, вектора и массивы для вас должны быть одним и тем же. Это с точки зрения реализации, вектора — это модель данных, которая намного сложнее стандартных массивов С++. Вернемся к коду, в строках 18 — 22 выполняется вывод массива на экран, для нас это тоже не новое. В строке 23, с помощью функции size()
мы получаем размер массива, согласитесь очень удобная штука.
Вспомните как сложно было присваивать обычные массивы, без цикла это было вообще не возможно. С векторами все обстоит иначе, доказательство тому — код в строке 25. Мы присвоили массиву array2
все элементы массива array
и при этом воспользовались одной лишь операцией присваивания. Ну как, круто? Подождите, это еще не все.
Заголовочный файл векторов предоставляет нам еще две интересные функции — front()
и back()
, они возвращают первый и последний элементы массива, соответственно, смотрите строки 29-30. Кстати, если вдруг по ходу выполнения программы, нам вдруг понадобится удалить массив, мы можем воспользоваться функцией clear()
, строка 32. По правде говоря, эта функция не удаляет полностью массив, она просто высвобождает память, которую занимают элементы этого массива. В итоге массив остается, но он будет пустым.
Как я упоминал, ранее, вектора могут изменять свой размер, ведь с технической точки реализации, вектора — это динамические массивы. В строке 33, к массиву array2
добавляется элемент -11
, причем он добавляется в конец массива, соответственно и размер массива увеличивается на один элемент. Согласитесь это очень удобно. Давайте посмотрим результат работы программы:
Введите размер массива: 5 Введите элементы массива: 1 2 3 4 5 Введенный массив: 1 2 3 4 5 Количество элементов массива: 5 Максимальное количество элементов массива: 5 Элементы второго массива (скопированы из первого): 1 2 3 4 5 Первый элемент массива array2: 1 Последний элемент массива array2: 5 Массив с новым последним элементом: 1 2 3 4 5 -11
Как видно, из вывода программы, все выше сказанное полностью соответствует результату работы программы. Постарался подробно все изложить по данной теме, если что-то не понятно, задавайте вопросы в комментариях или на форуме.
Комментарии
G.niyaz
Извините но ostream_iterator<int>(cout,» «) можно ли ее как нибудь по другому написать ?
admin
push_back() добавляет только в конец, в начало векторов вообще нельзя добавлять новые элементы, можно только перезаписывать существующие.
Fird
xxl.insert(xxl.begin(), 1); А это что тогда?
G.niyaz
к массиву
array2
добавляется элемент-11
Почему ? и может ли он добавится в середине или начале массива ?
G.niyaz
ostream_iterator<int>(cout,» «) что такое итератор я у запутался , маленько , и зачем он нам нужен я по гуглел не нашел ничего особенного если у вас , Admin , есть время то пожалуйста объясните !
admin
Простыми словами — это некий указатель на данные в памяти. С помощью итераторов, мы можем обращаться к «любым» элементам контейнера. В данном случае, с помощью итератора потока вывода ostream_iterator<int>(cout,»») мы организуем вывод в консоль.