Czy istnieje wbudowana funkcja wektorowa w C ++ do odwracania wektora w miejscu?
A może po prostu musisz to zrobić ręcznie?
Czy istnieje wbudowana funkcja wektorowa w C ++ do odwracania wektora w miejscu?
A może po prostu musisz to zrobić ręcznie?
Odpowiedzi:
Służy do tego funkcja std::reverse
w algorithm
nagłówku.
#include <vector>
#include <algorithm>
int main() {
std::vector<int> a;
std::reverse(a.begin(), a.end());
return 0;
}
Wszystkie kontenery oferują odwrócony widok zawartości za pomocą rbegin()
i rend()
. Te dwie funkcje zwracają tak zwane odwrotne iteratory , których można używać jak normalnych, ale będzie wyglądać tak, jakby kontener był faktycznie odwrócony.
#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(), "<-");
}
Przykład na żywo w Ideone . Wynik:
1->2->3->4->5
=============
5<-4<-3<-2<-1
std::sort
mieć wektor 1000 elementów, jeśli potrzebujesz tylko pierwszej dziesiątki w nieokreślonej kolejności, ponieważ jest bardziej elegancki niż std::partition
? To jest szkoła myślenia, która paraliżuje moje doświadczenie z komputerem, tak jak 15 lat temu, z tą różnicą, że jeszcze więcej cykli jest zmarnowanych, miliardy z nich.
print_range
nie jest poprawne: nie zadziała, jeśli zostanie przekazany pusty zakres.
std::reverse(a.rbegin(), a.rend())
zrobi? ; ^)
Możesz używać w std::reverse
ten sposób
std::reverse(str.begin(), str.end());
Możesz także użyć std::list
zamiast std::vector
. list
posiada wbudowaną funkcję list :: reverse do odwracania elementów.
Często powodem, dla którego chcesz odwrócić wektor, jest to, że wypełniasz go, wciskając wszystkie elementy na końcu, ale w rzeczywistości otrzymywałeś je w odwrotnej kolejności. W takim przypadku możesz odwrócić pojemnik w trakcie podróży, używając deque
zamiast tego i popychając je bezpośrednio z przodu. (Lub możesz vector::insert()
zamiast tego wstawiać elementy z przodu za pomocą , ale byłoby to powolne, gdy jest dużo elementów, ponieważ musi tasować wszystkie inne elementy przy każdym wstawianiu). W przeciwieństwie do:
std::vector<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_back(nextItem);
}
std::reverse(foo.begin(), foo.end());
Zamiast tego możesz:
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
}