Como passar um vetor como parâmetro em C++ – muito simples!

Vetor como parâmetro em C++

Enquanto pesquisava algo relacionado a vetores me deparei com a seguinte sugestão de pergunta feita pelo Google:”Como passar um vetor como parâmetro em C++”, e isso motivou a escrever este artigo. Achei importante fazê-lo porque a dúvida parece ser comum aos iniciantes da linguagem, e a resposta à pergunta é bastante simples.

Para passar um vetor como parâmetro de uma função em C++, basta escrever no parâmetro std::vetor<tipo> nomeDoParametro, respeitando o tipo que se deseja utilizar ao invocar a função. Se queremos fornecer como argumento de uma função chamada doubleNumbers, cujo retorno é void, um vetor de inteiros escrevemos void doubleNumbers(vector<int> nomeDoParametro).

Vejamos a seguir uma primeira tentativa de como se passar um vetor como parâmetro em C++.


Exemplo 1 – primeira tentativa: vetor passado por cópia

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void doubleNumbers (vector<int> numbers) {
    transform(begin(numbers), end(numbers), begin(numbers), [](int x) {return x * 2;});
    cout << "Numbers dentro da função: ";
    for (auto num : numbers)
        cout << num << " ";
}

int main() {
    vector<int> numbers {1, 2, 3, 4, 5};
    doubleNumbers(numbers);
    cout << "\nNumbers na main: ";
    for (auto num : numbers)
        cout << num << " ";
    
    return 0;
}

Numbers dentro da função: 2 4 6 8 10
Numbers na main: 1 2 3 4 5


O objetivo da função doubleNumbers é receber um vetor de inteiros e dobrar o valor de cada um dos números no vetor (através da função transform, da biblioteca padrão, e utilizando uma função lambda – assunto de um artigo futuro). Ela também imprime no terminal os elementos do vetor, e como podemos ver na saída do programa o vetor original teve todos os seus elementos dobrados – pelo menos dentro da função.

Contudo, após a execução da função, na main, os elementos do vetor são impressos novamente, e – talvez – para a surpresa da maioria, os seus valores estão inalterados, como se a função não tivesse feito nada. Como isso é possível?

A explicação é muito simples: a função recebe o vetor de inteiros por cópia, e não por referência. Como podemos saber isso? Note que o parâmetro da função é vector<int> numbers, sem o símbolo & entre o tipo do objeto (vector<int>) e o nome do parâmetro (number); logo, o parâmetro não é uma referência, e qualquer objeto que for passado como argumento da função será copiado, e modificações que forem feitas dentro da função não afetarão o objeto original.

Como fazemos, portanto, quando queremos modificar os valores do vetor parâmetro da função de modo persistente, para que as modificações sejam visíveis até mesmo depois que a função for executada? Precisamos passar o vetor por referência.

Passar vetor como parâmetro por referência em C++

Para passar um vetor como parâmetro por referência, é preciso escrever o símbolo & entre o tipo do vetor e o nome do parâmetro, como em void doubleNumbers(vector<int>& numbers) {...}. Só isso. Bastante fácil, não? Vejamos a seguir o mesmo código do exemplo 1, mas dessa vez com o parâmetro da função passado por referência.


Exemplo 2 – segunda versão: vetor passado por referência

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void doubleNumbers (vector<int>& numbers) {
    transform(begin(numbers), end(numbers), begin(numbers), [](int x) {return x * 2;});
    cout << "Numbers dentro da função: ";
    for (auto num : numbers)
        cout << num << " ";
}

int main() {
    vector<int> numbers {1, 2, 3, 4, 5};
    doubleNumbers(numbers);
    cout << "\nNumbers na main: ";
    for (auto num : numbers)
        cout << num << " ";
    
    return 0;
}

Numbers dentro da função: 2 4 6 8 10
Numbers na main: 2 4 6 8 10


Como vemos na saída do programa do exemplo 2, a modificação dos elementos do vetor feita dentro da função persiste após o fim da sua execução, e quando o vetor é impresso na saída do programa dentro da main, vemos que seus valores permaneceram dobrados.

Ótimo, conseguimos o que queríamos: tornar permanentes as modificações feitas no nosso vetor dentro da função doubleNumbers. No entanto, para imprimir os elementos do vetor na tela, temos uma duplicação de um bloco de código nas linhas 10-11 e 18-19. Seria melhor fatorar esse for e criar uma função que imprima os elementos do nosso vetor na tela, evitando assim tal duplicação de código. Isso me dá a oportunidade de falar dos vetores como parâmetros de funções passados por referência constante.

Vetor como parâmetro por referência constante em C++

A terceira forma de se passar um vetor como parâmetro de uma função em C++ é utilizar uma referência constante.

Usando uma referência constante, o vetor passado como argumento para a chamada da função não é copiado, mas ao contrário do que acontece com as referências normais, ele também não pode ser modificado. Assim sendo, os parâmetros de tipo referência constante para vetor são úteis quando se deseja apenas ler os elementos do vetor, sem modificá-los.

Sempre que se deseje apenas ler os elementos de um vetor dentro de uma função, use referências constantes, pois elas proibem modificações acidentais dos valores do vetor, e indicam claramente qual era a intenção do criador da função aos seus usuários.

No exemplo 3, eu criei uma função auxiliar que serve para imprimir os elementos do vetor na saída do programa, e para isso usei um parâmetro de referência constante para vetor de inteiros.


Exemplo 3 – versão final: função auxiliar com vetor passado por referência constante

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void printNumbers (const vector<int>& numbers)
{
    for (auto num : numbers)
        cout << num << " ";
}
void doubleNumbers (vector<int>& numbers) {
    transform(begin(numbers), end(numbers), begin(numbers), [](int x) {return x * 2;});
    cout << "Numbers dentro da função: ";
    printNumbers(numbers);
}

int main() {
    vector<int> numbers {1, 2, 3, 4, 5};
    doubleNumbers(numbers);
    cout << "\nNumbers na main: ";
    printNumbers(numbers);
    
    return 0;
}

Numbers dentro da função: 2 4 6 8 10
Numbers na main: 2 4 6 8 10


Próximos passos

Agora que você sabe como passar um vetor como parâmetro de função em C++, é importante conhecer como funcionam as funções template, pois muitas vezes elas são usadas juntamente com parâmetro de tipos vetor. Clique no link abaixo se quiser ir direto para o artigo. Até à próxima!

Gostou do artigo? Então inscreva-se na nossa newsletter para não perder nenhum dos nossos artigos 🙂

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 *