Відповіді:
Для цього std::reverse
в algorithm
заголовку є функція .
#include <vector>
#include <algorithm>
int main() {
std::vector<int> a;
std::reverse(a.begin(), a.end());
return 0;
}
Усі контейнери пропонують зворотний вигляд їх вмісту за допомогою rbegin()
та rend()
. Ці дві функції повертають так звані зворотні ітератори , які можна використовувати як звичайні, але виглядатиме так, що контейнер насправді перевернуто.
#include <vector>
#include <iostream>
template<class InIt>
void print_range(InIt first, InIt last, char const* delim = "\n"){
--last;
for(; first != last; ++first){
std::cout << *first << delim;
}
std::cout << *first;
}
int main(){
int a[] = { 1, 2, 3, 4, 5 };
std::vector<int> v(a, a+5);
print_range(v.begin(), v.end(), "->");
std::cout << "\n=============\n";
print_range(v.rbegin(), v.rend(), "<-");
}
Живий приклад на Ideone . Вихід:
1->2->3->4->5
=============
5<-4<-3<-2<-1
std::sort
отримали би векторний елемент 1000, якщо вам просто потрібна топ-10 у невстановленому порядку, адже він більш елегантний, ніж std::partition
? Це школа думки, яка калічить мій досвід роботи на ПК сьогодні, як це було 15 років тому, з тією різницею, що ще більше циклів витрачається на мільярди.
print_range
невірно: він не працюватиме, коли буде пропущено порожній діапазон.
std::reverse(a.rbegin(), a.rend())
робитиме? ; ^)
Ви можете використовувати std::reverse
так
std::reverse(str.begin(), str.end());
Ви також можете використовувати std::list
замість std::vector
. list
має вбудований список функцій :: реверс для елементів реверсу.
Часто причина, коли ви хочете повернути вектор, полягає в тому, що ви заповнюєте його, натискаючи всі елементи в кінці, але насправді отримуєте їх у зворотному порядку. У такому випадку ви можете перевернути контейнер, як рухаєтесь, використовуючи deque
замість цього і натискаючи їх прямо на передню частину. (Або ви можете vector::insert()
замість цього вставити елементи спереду , але це буде повільно, коли є багато предметів, тому що для кожного вставки потрібно переміщати всі інші елементи.) Отже, на відміну від:
std::vector<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_back(nextItem);
}
std::reverse(foo.begin(), foo.end());
Натомість ви можете робити:
std::deque<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_front(nextItem);
}
// No reverse needed - already in correct order
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int>v1;
for(int i=0; i<5; i++)
v1.push_back(i*2);
for(int i=0; i<v1.size(); i++)
cout<<v1[i]; //02468
reverse(v1.begin(),v1.end());
for(int i=0; i<v1.size(); i++)
cout<<v1[i]; //86420
}