Как перевернуть vector c

Обновлено: 02.07.2024

Is there a built-in vector function in C++ to reverse a vector in place?

Or do you just have to do it manually?


1,493 2 2 gold badges 13 13 silver badges 26 26 bronze badges 8,874 20 20 gold badges 53 53 silver badges 81 81 bronze badges

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

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

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

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

Вектор в строку С++

Как превратить вектор в число и перевернуть его на языке С++? В JS это делается вот так:

То есть получается именно число. А для С++? Как например и вектора

Надо получить число

Числа в исходном векторе ТОЛЬКО однозначные.


А исходная задача именно так стоит ? Про вектор чисел? Не про число из цифр, которые надо перевернуть и получить число? @vegorov Исходная задача — именно вектор чисел перевернуть и получить число. 109k 24 24 золотых знака 98 98 серебряных знаков 262 262 бронзовых знака

Вариант, работающий даже с многозначными числами:

Если эти многозначные числа тоже надо развернуть - ну, это труднее:

См. работающую программу здесь.

Ну, а если нужно число (хотя в заголовке вы пишете "в строку") - то можно просто применить к полученной строке stoll .

Можно и проще, но непонятно, как именно обрабатывать многозначные числа. Если уточните, во что должен превратиться вектор, скажем, - то поговорим :)

Для только однозначных чисел идеален как в смысле простоты, так и производительности метод @ARHovsepyan, который я, впрочем, переписал бы в одну строку:

в основном из-за того, чтов таком случае он применим практически к любому контейнеру (кроме forward_list и всех unordered , причем к последним - просто потому, что понятие порядка у них отсутствует).

Варианты предыдущий мой и @Qwertiy нужны для многозначных чисел, но оба страдают от лишнего преобразования - у меня в строку, у @Qwertiy - в строку, поток и опять в число.

6 Answers 6

There's a function std::reverse in the algorithm header for this purpose.

74.3k 15 15 gold badges 84 84 silver badges 134 134 bronze badges 65.1k 15 15 gold badges 115 115 silver badges 165 165 bronze badges @VikasGoel in fact the snippet you suggest should work. Maybe there is some other problem?

All containers offer a reversed view of their content with rbegin() and rend() . These two functions return so-calles reverse iterators, which can be used like normal ones, but it will look like the container is actually reversed.

125k 46 46 gold badges 281 281 silver badges 385 385 bronze badges print_range is not correct: it will not work when empty range is passed. so the big question is, what will std::reverse(a.rbegin(), a.rend()) do? ;^)

You can use std::reverse like this

14.4k 12 12 gold badges 85 85 silver badges 119 119 bronze badges

Often the reason you want to reverse the vector is because you fill it by pushing all the items on at the end but were actually receiving them in reverse order. In that case you can reverse the container as you go by using a deque instead and pushing them directly on the front. (Or you could insert the items at the front with vector::insert() instead, but that would be slow when there are lots of items because it has to shuffle all the other items along for every insertion.) So as opposed to:

You can instead do:

7,048 1 1 gold badge 27 27 silver badges 44 44 bronze badges

You can also use std::list instead of std::vector . list has a built-in function list::reverse for reversing elements.

Заключение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Что такое вектор в C++

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

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

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

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

Векторные функции C++

Есть много общедоступных функций-членов, связанных с векторами C ++. Давайте посмотрим на некоторые функции и то, что они делают.

cbegin: возвращает const_iteratorуказатель на первый элемент в контейнере

Примечание. A const_iterator- это итератор, указывающий на содержимое const. Его можно увеличивать и уменьшать, как и iteratorвозвращаемый функцией vector::begin, но его нельзя использовать для изменения содержимого, на которое он указывает.

  • cend: возвращает const_iteratorуказатель на последний элемент в контейнере
  • crbegin: возвращает const_reverse_iteratorуказатель на последний элемент в контейнере
  • crend: возвращает const_reverse_iteratorуказатель на теоретический элемент, предшествующий первому элементу в контейнере
  • emplace_back: вставляет новый элемент в конец вектора сразу после текущего последнего элемента
  • max_size: возвращает максимальный размер
  • pop_back: удаляет последний элемент в векторе
  • push_back: добавляет новый элемент в конец вектора
  • rbegin: возвращает обратный итератор, указывающий на последний элемент в векторе

Примечание. Обратные итераторы выполняют итерацию в обратном направлении. Увеличение обратного итератора перемещает его к началу контейнера.

  • rend: возвращает обратный итератор, указывающий на теоретический элемент, предшествующий первому элементу в векторе
  • shrink_to_fit: запрашивает контейнер, чтобы уменьшить его емкость, чтобы соответствовать его размеру
  • std::vector::end: возвращает итератор, относящийся к последнему элементу в векторном контейнере
  • vector::capacity: возвращает размер дискового пространства, выделенного в данный момент для вектора.
  • vector::front: возвращает ссылку на первый элемент вектора
  • vector::back: возвращает последний элемент вектора
  • vector::size: возвращает количество элементов в векторе

Примечание. Возвращает количество фактических объектов, содержащихся в векторе, которое не обязательно равно его емкости хранения.

  • vector::begin: возвращает итератор, указывающий на первый элемент вектора

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

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

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

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

Как инициализировать вектор C ++

Теперь, когда мы знаем больше об основах и некоторых функциях векторов C ++, давайте обсудим методы инициализации.

Есть четыре способа инициализировать вектор в C ++ :

Использование массива

Этот метод передает массив конструктору векторного класса. Переданный массив содержит элементы, которые будут заполнять вектор.

Что такое вектор в C++?

Что такое вектор в C++

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

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

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

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

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

Что std::vectorв C ++?

Векторы C ++ (также известные как std::vector) представляют собой контейнеры последовательностей, которые представляют собой массивы, размер которых может изменяться. Они используются для работы с динамическими данными и используют непрерывные места хранения для своих элементов. Вы можете эффективно получить доступ к элементам, используя смещения обычных указателей. Внутренне векторы C ++ используют динамически выделяемые массивы для хранения своих элементов. Для массива может потребоваться перераспределение, чтобы он мог увеличиваться в размере при вставке новых элементов.

Векторные контейнеры могут выделять дополнительное пространство для хранения, чтобы приспособиться к потенциальному росту, поэтому контейнер может иметь большую емкость, чем то, что на самом деле хранится внутри него. Вы можете использовать библиотеки для применения различных стратегий роста, чтобы найти баланс между перераспределением и использованием памяти, но перераспределение должно происходить только с логарифмически увеличивающимися интервалами размера. Это позволяет использовать амортизированную постоянную временную сложность при вставке отдельных элементов в конец вектора.

Поскольку векторы C ++ выполняют автоматическое перераспределение, они могут эффективно управлять хранилищем и динамически расти. Хотя они потребляют больше памяти, чем массивы, их эффективность и гибкость делают использование векторов целесообразным.

Давайте обсудим еще несколько преимуществ C ++ vector:

Читайте также: