Есть ли в C ++ встроенная векторная функция для обратного вектора?
Или вам просто нужно сделать это вручную?
Есть ли в C ++ встроенная векторная функция для обратного вектора?
Или вам просто нужно сделать это вручную?
Ответы:
Для этого 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
имеет встроенную функцию list :: reverse для реверсирования элементов.
Часто причина, по которой вы хотите повернуть вектор, заключается в том, что вы заполняете его, нажимая на все элементы в конце, но фактически получаете их в обратном порядке. В этом случае вы можете перевернуть контейнер по ходу движения, используя 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
}