Você já se deparou com o seguinte problema: como ordenar os elementos de um vetor em C++, em ordem crescente/decrescente (quando se trata de números) ou em ordem alfabética (para caracteres ou strings)? Se sim, você certamente está longe de ser o único, e por essa razão acredito que valha a pena falar desse assunto.
Os dois métodos usados para se ordenar um vetor em c++ são std::sort(iteradorDeInicio, iteradorDeFim)
, e std::ranges::sort(vetor)
. Vejamos a seguir uma breve amostra do uso dos dois métodos para se ordenar um vetor de inteiros.
Ordenar um vetor em C++: Método #1 – std::sort( )
A maneira mais simples de se ordenar um vetor em C++ é utilizar o método sort() da biblioteca padrão, exportado pelo header <algorithm>. Por que é tão fácil? Bem, porque apenas precisamos fornecer dois iteradores que delimitem o array a ser ordenado, e pronto! A ordenação é feita no próprio vetor, ou seja, não é preciso armazenar o retorno da função em uma nova variável. Parece fácil, não? Vejamos um exemplo abaixo.
Exemplo 1 – Ordernar um vetor em C++ com std::sort
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> numeros {0, 10, 30, 20, 60, 40, 70, 50}; for (const auto& num : numeros) { cout << num << " "; } cout << endl; sort(numeros.begin(), numeros.end()); for (const auto& num : numeros) { cout << num << " "; } cout << endl; }
Como podemos ver no exemplo acima, é muito fácil ordenar um vetor de inteiros (ou de qualquer outro tipo de dados padrão) em C++. Antes de prosseguirmos, note que eu usei a diretiva using namespace std
para não precisar digitar o namespace std (std::
) antes dos nomes vector
e sort
– voltemos ao sort. Na linha 19, o método sort é invocado como segue: sort(numeros.begin(), numeros.end())
.
std::sort – sintaxe
std::sort(iteradorDeInicio, iteratorParaAlemDoFim)
A sintaxe para se invocar o sort
é a seguinte: sort(iteradorDeInicio, iteradorDeFim)
. O primeiro argumento, iteradorDeInicio
, determina o início da faixa de valores a se ordenar; o segundo, iteradorDeFim
, estabelece o fim da faixa, sem incluir o elemento para o qual ele aponta – em linguagem matemática, a faixa poderia ser escrita como [iteradorDeInicio, iteradorDeFim): note o conjunto aberto no fim da faixa. Analisemos agora os argumentos que passamos para o sort na linha 19 do exemplo 1.
O primeiro argumento que passamos é numeros.begin()
, um iterador que aponta para o primeiro elemento do vetor de inteiros (o número 0). O segundo argumento é numeros.end()
, um iterador que aponta para uma posição além do último elemento do vetor numeros
– sim, isso mesmo, o iterador obtido com .end()
aponta para além do fim do vetor. Isso é assim porque a faixa de valores que serão ordenados não inclui o elemento para o qual o segundo iterador aponta. Logo, apontando para uma posição além do último elemento do vetor, garante-se que o último elemento será incluído na ordenação.
Por fim, é também importante saber que a ordenação dos elementos feita pelo método std::sort
(assim como aquela feita pelo std::ranges::sort
) utiliza o operador <
dos elementos contidos no vetor. Todavia, esse comportamento pode ser alterado caso de deseje modificar a ordem final dos elementos (e.g.: ordená-los em ordem decrescente) fornecendo um outro argumento para o método sort
, mas este será o assunto de um outro artigo.
Ordenar um vetor em C++: Método #2 – std::ranges::sort( )
Sim, o outro método para se ordenar um vetor em C++ também se chama sort, e ainda mais é usado de modo muito semelhante ao seu homônimo, mas com uma vantagem: é ainda mais simples. Ao invés de exigir um par de iteradores, o método sort
pertencente ao namespace std::ranges
requer apenas um único argumento: o vetor que se deseja ordenar. Mais simples, impossível. A sintaxe portanto é a seguinte: std::ranges::sort(vetor-a-ordenar)
. Contudo, é importante notar que o std::ranges::sort
só está disponível a partir do C++20 (se seu projeto usa uma versão mais antiga do C++, utilize o método std::sort
).
Vejamos abaixo um exemplo do uso do ranges::sort
para ordenar o vetor de inteiros que usamos no exemplo 1.
Exemplo 2 – Ordernar um vetor em C++ com std::ranges::sort
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> numeros {0, 10, 30, 20, 60, 40, 70, 50}; for (const auto& num : numeros) { cout << num << " "; } cout << endl; ranges::sort(numeros); for (const auto& num : numeros) { cout << num << " "; } cout << endl; }
Note no exemplo acima o uso do sort na linha 19. Veja que não precisei escrever std::ranges::sort(numeros)
, mas apenas ranges::sort(numeros)
, pois eu empreguei o using namespace std;
no início do código (linha 9), assim como fiz no exemplo #1. O resultado da operação sort
, como podemos ver, é o mesmo que aquele obtido no exemplo #1 – todos os elementos foram ordenados em ordem crescente como esperado.
std::ranges::sort – sintaxe
std::ranges::sort(vetor)
Conclusão
Tratei neste artigo de dois métodos muito simples para se ordenar um vetor em C++: std::sort
e std::ranges::sort
. Ambos os métodos ordenam uma sequência de entrada, mas o método std::sort
usa um par de iteradores que apontam para um vetor que lhes é subjacente, enquanto o std::ranges::sort
simplifica a vida do usuário aceitando em sua entrada apenas o próprio vetor que se deseja ordenar.
Sou apaixonado por tecnologia, literatura e também filosofia. O cultivo dessas paixões ao longo da minha trajetória me inspiraram a compartilhar aquilo que aprendo com os outros da maneira mais clara que eu possa. Sou formado em Engenharia Elétrica no Brasil, e também sou engenheiro formado na França. Trabalho atualmente como programador C++ em uma multinacional francesa, uma das maiores empresas de TI do mundo.