Как перевернуть вектор в C++?

Что такое вектор в C++ Программирование и разработка

Если вектор имеет элементы в последовательности, {’A’, ’B’, ’C’, ’D’, ’E’}, и он переконфигурируется так, что его последовательность становится, {’E’, ’D’, ’ C ’,’ B ’,’ A ’}, то вектор был перевернут. К сожалению, в C ++ такая прямая обратимость невозможна. Однако вектор в C ++ может повторяться сзади, и это косвенная обратимость. При этом нет необходимости буквально переворачивать вектор. В этой статье объясняется, как выполнить итерацию вектора в C ++ с обратной стороны и изменить его элементы.

Перед использованием вектора в C ++ программа должна начинаться с,

#include <iostream>
#include <vector>
using namespace std;

с включенной векторной библиотекой. Обратную итерацию легче понять, если составить сводку пересылки итерации. Таким образом, перед объяснением обратной итерации сначала резюмируется прямая итерация.

Прямая итерация

Прямая итерация имеет дело с двумя итераторами. Итератор — это тщательно продуманный объект-указатель со специальными характеристиками. Здесь два интересующих нас итератора возвращаются функцией-членом begin () и функцией-членом end (). Функция-член begin () возвращает итератор, указывающий на первый элемент вектора. Функция-член end () возвращает итератор, который указывает сразу за последним элементом вектора.

Предположим, что имя вектора — vtr, тогда следующий оператор вернет начальный итератор:

vector<char>::iterator p = vtr.begin();

где p — имя начального итератора. Следующий оператор вернет конечный итератор:

vector<char>::iterator q = vtr.end();

где q — это имя, данное конечному итератору, из двух приведенных выше операторов видно, что p и q имеют один и тот же тип и даже могут быть заменены местами.

Все фрагменты кода для этой статьи написаны в функции main (). Следующий код считывает все элементы вектора от начала до последнего:

vector<char> vtr = {‘A’‘B’‘C’‘D’‘E’};

for (vector<char>::iterator p = vtr.begin(); p != vtr.end(); p++) {
cout << *<< ‘ ‘;
}
cout < vtr = {‘A’‘B’‘C’‘D’‘E’};

vector<char>::iterator q = vtr.end();
for (= q; q >= vtr.begin(); q) {
cout << *<< ‘ ‘;
}
cout << endl;

Результат:

A B C D E

Код в круглых скобках цикла for требует пояснения. p — итератор, который сначала указывает на первый элемент вектора. Хотя он еще не указывает только за пределы вектора, он увеличивается на p ++, чтобы указать на каждый элемент в векторе. Когда он указывает на элемент в векторе, значение (символ) элемента получается с помощью * p в теле цикла for. * — косвенный оператор.

Следующий код считывает и отображает значения в векторе от последнего элемента до первого элемента, используя конечный итератор:

vector<char>vtr = {‘A’‘B’‘C’‘D’‘E’};

vector<char>::iterator q = vtr.end();
for (= q; q >= vtr.begin(); q) {
cout << *<< ‘ ‘;
}
cout << endl;

Результат:

 E D C B A

Конечный итератор указывает сразу за концом вектора, и это не элемент. Таким образом, он должен быть сначала уменьшен, прежде чем он сможет указывать на последний элемент. Оттуда итерация может идти назад.

Читайте также:  Лучшие проекты JavaScript для начинающих

Условие while для цикла for здесь: «если q больше или равно начальному итератору». Не может быть «если q не равно начальному итератору», так как это исключит первый элемент.

Это неформальный способ итерации в обратном направлении. То есть это неформальный способ косвенного обращения вектора.

Изменение значения элемента

Когда экземпляру вектора не предшествует const (для константы), значение любого элемента в векторе может быть изменено. Следующий код иллюстрирует это:

vector<char> vtr = {‘A’‘B’‘C’‘D’‘E’};

vector<char>::iterator q = vtr.end();
q; q; q;

*= ‘Z’;

vector<char>::iterator r = vtr.end();
for (= r; r >= vtr.begin(); r) {
cout << *<< ‘ ‘;
}
cout << endl;

Результат:

E D Z B A

Конечный итератор q уменьшается три раза на «q—; q—; q—; » указать на «C».

Если экземпляру вектора предшествует константа, то значение элемента не может быть изменено. В этом случае постоянный прямой итератор должен быть возвращен для конечного или начального итератора. Следующий код не будет компилироваться, потому что сделана попытка изменить значение ’C’:

const vector<char> vtr = {‘A’‘B’‘C’‘D’‘E’};

vector<char>::const_iterator q = vtr.end();
q; q; q;

*= ‘Z’;

Обратная итерация

У обратной итерации есть два основных итератора. Эти итераторы возвращаются функциями-членами rbegin () и rend (). rend () возвращает итератор, который указывает прямо перед первым элементом вектора. rbegin () возвращает итератор, указывающий на последний элемент вектора. Следующий код считывает и отображает элементы вектора от первого до последнего в прямом направлении:

vector<char> vtr = {‘A’‘B’‘C’‘D’‘E’};

vector<char>>:reverse_iterator p = vtr.rend();

for (= p; p >= vtr.rbegin(); p) {
cout << *<< ‘ ‘;
}
cout << endl;

Результат:

A B C D E

Используется обратный итератор. Поскольку rend () возвращает итератор, который указывает прямо перед первым элементом, который не является элементом, его необходимо увеличить, чтобы указать на первый элемент. Поскольку мы имеем дело с обратным итератором, оператор приращения здесь — а не ++. Кроме того, в условии while> = используется вместо <=.

Следующий код считывает и отображает значения в векторе от последнего элемента до первого, используя итератор rbegin ():

vector<char> vtr = {‘A’‘B’‘C’‘D’‘E’};

for (vector<char>::reverse_iterator q = vtr.rbegin(); q <= vtr.rend(); q++) {
cout << *<< ‘ ‘;
}
cout << endl;

Результат:

E D C B A

Функция-член rbegin () возвращает итератор, указывающий на последний элемент вектора. Возвращенный итератор — это reverse_iterator. rend () возвращает итератор, который указывает непосредственно перед первым элементом. Обратите внимание, что условие while для цикла for имеет but =, поскольку мы имеем дело с обратным итератором. Уменьшение с помощью этого итератора — ++, а не -.

Читайте также:  Как использовать системный вызов Readv на C

Изменение значения элемента

Когда экземпляру вектора не предшествует const (для константы), значение любого элемента в векторе может быть изменено с помощью reverse_iterator. Следующий код иллюстрирует это с помощью reverse_iterator:

vector<char> vtr = {‘A’‘B’‘C’‘D’‘E’};

vector<char>::reverse_iterator q = vtr.rbegin();
q++; q++;

*= ‘X’;

for (vector<char>::reverse_iterator r = vtr.rbegin(); r <= vtr.rend(); r++) {
cout << *<< ‘ ‘;
}
cout << endl;

Результат:

E D X B A

Итератор rbegin (), q уменьшается два раза на «q ++; q ++; » чтобы указать на ’C’, поскольку он изначально указывает на последний элемент.

Если экземпляру вектора предшествует const, то никакое значение элемента не может быть изменено с помощью итератора, будь то итератор reverse_iterator (или вперед). В этом случае постоянный обратный итератор должен быть возвращен для функции rbegin () или rend (). Следующий код не будет компилироваться, потому что сделана попытка изменить значение ’C’:

const vector<char> vtr = {‘A’‘B’‘C’‘D’‘E’};

vector<char>::const_reverse_iterator q = vtr.rbegin();
q++; q++;

*= ‘X’;

Постоянный обратный итератор

crbegin () ведет себя как rbegin (), но возвращает const_reverse_iterator независимо от того, было ли создание экземпляра вектора начато с const. Это означает, что значение возвращенного итератора изменить нельзя. crend ​​() ведет себя как rend (), но возвращает const_reverse_iterator независимо от того, было ли создание экземпляра вектора начато с const. Это означает, что значение возвращенного итератора изменить нельзя.

Следующий код отображает все значения вектора, используя const_reverse_iterator, начиная с последнего элемента:

vector<char> vtr = {‘A’‘B’‘C’‘D’‘E’};

for (vector<char>::const_reverse_iterator q = vtr.crbegin(); q <= vtr.crend(); q++) {
cout << *<< ‘ ‘;
}
cout << endl;

Результат:

E D C B A

Следующий код не будет компилироваться, потому что здесь мы имеем дело с постоянным обратным итератором. Создание экземпляра вектора не предшествует const.

vector<char> vtr = {‘A’‘B’‘C’‘D’‘E’};

for (vector<char>::reverse_iterator q = vtr.rbegin(); q <= vtr.rend(); q++) {
cout << *<< ‘ ‘;
}
cout << endl;

Заключение

Вектор нельзя поменять местами буквально. Однако его можно повторять от начала до конца, чтобы получить аналогичный результат. При прямой итерации задействованы функции-члены begin () и end (). В случае обратной итерации задействуются функции-члены, rbegin () и rend (). В этом случае задействованный итератор — это reverse_iterator, а не итератор. Тем не менее, в этом случае ++ — это -, а> = — это <=. Также существует const_reverse_iterator для функций-членов crbegin () и crend ​​().

Оцените статью
bestprogrammer.ru
Добавить комментарий