Existe uma função de vetor embutida no C ++ para reverter um vetor no lugar?
Ou você apenas precisa fazer isso manualmente?
Existe uma função de vetor embutida no C ++ para reverter um vetor no lugar?
Ou você apenas precisa fazer isso manualmente?
Respostas:
Há uma função std::reverse
no algorithm
cabeçalho para esse fim.
#include <vector>
#include <algorithm>
int main() {
std::vector<int> a;
std::reverse(a.begin(), a.end());
return 0;
}
Todos os contêineres oferecem uma visão invertida de seu conteúdo com rbegin()
e rend()
. Essas duas funções retornam os chamados iteradores reversos , que podem ser usados como normais, mas parecerá que o contêiner está realmente invertido.
#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(), "<-");
}
Exemplo ao vivo no Ideone . Resultado:
1->2->3->4->5
=============
5<-4<-3<-2<-1
std::sort
precisaria de um vetor de 1000 elementos, se precisar apenas dos 10 primeiros em ordem não especificada, porque é mais elegante do que std::partition
? Esta é a escola de pensamento que paralisa minha experiência com o PC hoje, como aconteceu há 15 anos, com a diferença de que ainda são desperdiçados mais ciclos, bilhões deles.
print_range
não está correto: não funcionará quando o intervalo vazio for ultrapassado.
std::reverse(a.rbegin(), a.rend())
? ; ^)
Você pode usar std::reverse
assim
std::reverse(str.begin(), str.end());
Você também pode usar em std::list
vez de std::vector
. list
possui uma função interna list :: reverse para reverter elementos.
Freqüentemente, o motivo pelo qual você deseja reverter o vetor é porque você o preenche pressionando todos os itens no final, mas realmente os recebe na ordem inversa. Nesse caso, você pode inverter o contêiner usando um deque
botão e empurrando-o diretamente na frente. (Ou vector::insert()
, em vez disso, você pode inserir os itens na frente , mas isso seria lento quando houver muitos itens, pois é necessário embaralhar todos os outros itens para cada inserção.) Portanto, ao contrário de:
std::vector<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_back(nextItem);
}
std::reverse(foo.begin(), foo.end());
Você pode fazer:
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
}