Consigo entender quando usar listas, mas não entendo quando é melhor usar vetores do que usar listas em videogames: quando é melhor ter acesso aleatório rápido?
(E eu entendo por que é mais rápido inserir / excluir em listas porque apenas remove / adiciona ponteiros, mas ainda precisa encontrar o item correspondente ...)
c++
algorithm
data-structure
jokoon
fonte
fonte
container
.Respostas:
Minha regra de ouro, e tenho certeza de que haverá debate sobre isso, é nunca usar listas (a menos que você precise remover com muita, muita frequência coisas do meio de grandes listas).
A velocidade que você ganhará ao ter todos os seus elementos em seu contêiner na memória contígua (e, portanto, mais amigável ao cache) vale a compensação dos custos adicionais de adicionar / remover / redimensionar o vetor.
Edit: Apenas para esclarecer um pouco mais, é claro que não é preciso dizer que qualquer tipo de pergunta "que é mais rápida" deve ser testada em qualquer plataforma com quaisquer conjuntos de dados pertinentes às suas necessidades particulares. Se eu apenas precisar de uma coleção de elementos, apenas uso vetor (ou deque, que é quase a mesma coisa), a menos que haja um bom motivo para não fazê -lo.
fonte
Use uma lista quando a invalidação do iterador causada pela modificação do meio da estrutura de dados causar um problema ou você precisar manter seus elementos classificados para que o truque de troca e pop para exclusões rápidas da coleção do meio não funcione e você tenha uma grande número de exclusões de coleção intermediária.
Você também pode considerar usar um Deque. Possui características de desempenho semelhantes às de um vetor, mas não possui necessidade de memória contígua e é um pouco mais flexível.
fonte
Sua escolha deve refletir suas necessidades. Todos os elementos dos vetores são contínuos na memória e as listas têm ponteiros para os elementos seguintes / anteriores, para que cada um tenha suas vantagens / desvantagens:
Listas:
Vetores:
Portanto, a lista é melhor quando o programa precisa adicionar e remover elementos com frequência, mas nunca acesse (ou raramente acesse) um elemento específico sem a necessidade dos outros antes. O vetor deve ser usado para melhorar o tempo de acesso, mas falta eficiência quando você precisa remover ou adicionar elementos.
Verifique esta postagem no stackoverflow, ela apresenta um gráfico muito bom, com perguntas básicas sobre suas necessidades, que o levam a um contêiner específico, dependendo de suas respostas:
/programming/366432/extending-stdlist
fonte
Geralmente, as listas são usadas para estruturas como filas, nas quais existem muitas operações de acréscimo e remoção. Exemplo: uma lista em constante mudança de entidades que devem ser atualizadas. A lista em si contém apenas entidades na tela e, portanto, muda frequentemente.
Os vetores (ou matrizes) são mais adequados para uma coleção que não muda muito e onde você precisa de acesso rápido a itens individuais da coleção. Exemplo: um mapa de blocos em que você precisa procurar blocos em um determinado índice.
A opinião do Tetrads pode ser verdadeira, mas depende da linguagem de programação usada. Vejo que você marcou sua pergunta
c++
, mas tentei dar uma resposta que não é específica ao idioma.fonte
Nos jogos de console, nunca usamos std :: list porque:
Até o std :: vector está perdendo o interesse nos consoles porque:
fonte
struct point{float x, y, z, w}; std::vector<point> positions;
point
é um objeto C ++ (como éstd::vector
, como é algo tão simples quantofloat
). Eu sei a distinção que você está tentando fazer, mas está fazendo um mau trabalho de explicá-la.