Ir para o conteúdo

Última atualização:2026-10-12

Idiom de avaliação preguiçosa em C++


No desenvolvimento de software, a avaliação preguiçosa (lazy evaluation or call-by-need) é uma técnica poderosa que nos permite adiar o cálculo de uma expressão, executando-o somente quando ele for realmente necessário.

Essa técnica é especialmente útil no tratamento de grandes volumes de dados ou em casos que exigem cálculo dinâmico.

1. O que é avaliação preguiçosa?

Avaliação preguiçosa significa adiar o cálculo das expressões, executando-o somente quando elas forem realmente necessárias. A vantagem dessa técnica está em melhorar a eficiência e o desempenho do programa, sobretudo no tratamento de grandes volumes de dados ou em casos que exigem cálculo dinâmico.

A implementação da avaliação preguiçosa geralmente é feita por meio de chamadas de função adiadas ou da avaliação adiada de expressões. Isso significa que o cálculo de uma expressão é adiado até o momento em que ela é usada, em vez de executado imediatamente na definição.

2. Vários métodos de implementação

Em C++, temos várias formas de implementar a avaliação preguiçosa. Estes são alguns métodos comuns:

  1. Expressões Lambda: uma expressão lambda pode ser usada para representar uma função anônima, permitindo o cálculo adiado no ponto onde for necessário.
auto delayedCalculation = []() {
    std::cout << "延迟计算" << std::endl;
    return 42;
};
  1. std::function: std::function pode ser usado para encapsular funções, de modo que a execução da função possa ser adiada para um momento posterior.
std::function<int()> delayedCalculation = []() {
    std::cout << "延迟计算" << std::endl;
    return 42;
};
  1. std::bind: std::bind pode ser usado para vincular funções e argumentos, gerando um objeto callable que adia a chamada da função.
auto delayedCall = std::bind(delayedCalculation, 42);
  1. Ponteiros de função: por meio de um ponteiro para função, é possível chamar a função correspondente quando necessário, implementando a avaliação preguiçosa.
void delayedCalculation() {
    std::cout << "延迟计算" << std::endl;
}

void (*funcPtr)() = &delayedCalculation;
(*funcPtr)();
  1. Avaliação preguiçosa (lazy evaluation): a avaliação preguiçosa é um paradigma de cálculo adiado que procrastina a avaliação de uma expressão até o momento em que ela for realmente necessária.
auto it = std::begin(vec);
std::cout << "第一个元素:" << *it << std::endl;
  1. Geradores: um gerador é uma técnica para gerar sequências de forma preguiçosa, permitindo gerar os elementos da sequência sob demanda, em vez de gerar todos de uma vez.
std::vector<int> generateSequence(int n) {
    std::vector<int> result;
    for (int i = 0; i < n; ++i) {
        result.push_back(i);
    }
    return result;
}

Além destes, quais outras implementações existem? Seja bem-vindo a discutir comigo.

Tópicos relacionados

Comentários