O melhor que C++ tem a oferecer…

… na minha opinião, são os containers da Standard Template Library. Claro que vocẽ pode discordar e pensar nos fundamentos da programação orientada à objetos: Herança, Polimorfismo e Encapsulamento. Ou então apontar para a sobrecarga de funções e operadores. Ou, ainda, a maneira mais “simples” de realizar alocação dinâmica através de new e delete. Mas eu acho mesmo que a STL é a grande vantagem. Todo o resto pode ser feito, cuidadosamente, em C.

Uma experiência recente me mostrou que containers, embora gerem mais código do que o equivalente em C, implementam o state of the art, no que se refere às suas entranhas. Por exemplo, os containers associativos (maps, sets, multimaps e multisets) usam a super-eficiente red black tree para armazenar o conteúdo. Esse tipo de árvore é balanceada. Por outro lado, os containers sequenciais (vector, deque e list) fazem um bom gerenciamento da memória e te livram da alocação dinâmica.

Um exemplo de uso é o que, no OpenGL, é conhecido como Interleaved Arrays. Precisamos ler os pontos, vetores normais, coordenadas de texturas e cor de vértices de um modelo para podermos desenhá-lo. Usando a STL isso fica bem fácil:

#include <vector>

struct vertice_t
{
  float u, v;          /* texture coordinate */
  float r, g, b, a;    /* Color */
  float nx, ny, nz;    /* normal */
  float vx, vy, vz;    /* vertice */
};

vertice_t v;
std::vector<vertice_t> vertices;

while (getNextVerticeFromModel(modelId, &v))
  vertices.push_back(v);

/* Num container sequencial, se pegarmos o ponteiro para
   o primeiro elemento, o array todo pode estará acessível. */
glInterleavedArrays(GL_T2F_C4F_N3F_V3F, 0, &vertices[0]);

/* Quando for desenhar: */
glDrawArrays( GL_TRIANGLES, 0, vertices.size());

Existe mais de uma vantagem em usar os containers: Quando ele sai do escopo, todo o conteúdo é destruído. É como se tivéssemos um garbage collector… A desvantagem (que não é tão ruim assim) é que o objeto contido precisa ter um destrutor, um construtor de cópia e um operador de assinalamento — no caso acima, os defaults me servem muito bem.

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s