Como ordenar um vetor em C++ – Mais fácil, impossível! 2 modos com exemplos.

Como ordenar um vetor em C++? 2 modos simples

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;
}

0 10 30 20 60 40 70 50
0 10 20 30 40 50 60 70


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;
}

0 10 30 20 60 40 70 50
0 10 20 30 40 50 60 70


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.

Foto de perfil de Emanoel

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.

Leave a Reply

Your email address will not be published. Required fields are marked *