Não posso discordar com o espírito da resposta aceita com força suficiente. "Uma ferramenta de último recurso"? Longe disso!
A meu ver, um dos recursos mais fortes do C ++ em comparação com o C e com outras linguagens semelhantes é a capacidade de expressar restrições para que possam ser verificadas em tempo de compilação e que o uso indevido acidental possa ser evitado. Portanto, ao projetar uma estrutura, pergunte-se que operações ela deve permitir. Todos os outros usos devem ser proibidos, e é melhor que essas restrições possam ser implementadas estaticamente (em tempo de compilação), para que o uso indevido resulte em falha na compilação.
Portanto, quando alguém precisa de uma matriz, as respostas para as seguintes perguntas especificam seu comportamento: 1. Seu tamanho é a) dinâmico em tempo de execução ou b) estático, mas conhecido apenas em tempo de execução ou c) estático e conhecido em tempo de compilação? 2. A matriz pode ser alocada na pilha ou não?
E, com base nas respostas, é isso que considero a melhor estrutura de dados para uma matriz desse tipo:
Dynamic | Runtime static | Static
Stack std::vector unique_ptr<T[]> std::array
Heap std::vector unique_ptr<T[]> unique_ptr<std::array>
Sim eu acho unique_ptr<std::array>
que também deve ser considerado, e nem é uma ferramenta de último recurso. Basta pensar no que melhor se ajusta ao seu algoritmo.
Tudo isso é compatível com APIs C simples por meio do ponteiro bruto para a matriz de dados ( vector.data()
/ array.data()
/ uniquePtr.get()
).
PS Além das considerações acima, há também uma propriedade: std::array
e std::vector
possui semântica de valor (possui suporte nativo para copiar e transmitir por valor), enquanto unique_ptr<T[]>
só pode ser movida (aplica a propriedade única). Qualquer um pode ser útil em diferentes cenários. Pelo contrário, matrizes estáticas simples ( int[N]
) e dinâmicas simples ( new int[10]
) não oferecem e, portanto, devem ser evitadas se possível - o que deve ser possível na grande maioria dos casos. Se isso não bastasse, matrizes dinâmicas simples também não oferecem maneira de consultar seu tamanho - oportunidade extra para corrupção de memória e falhas de segurança.
std::shared_ptr<T[]>
, mas deveria existir e provavelmente estará no C ++ 14 se alguém se desse ao trabalho de escrever uma proposta. Enquanto isso, sempre háboost::shared_array
.