Eu quero usar uma estrutura de dados de fila em meu programa Objective-C. Em C ++, eu usaria a fila STL. Qual é a estrutura de dados equivalente em Objective-C? Como faço para empurrar / abrir itens?
objective-c
cocoa
data-structures
queue
MrDatabase
fonte
fonte
-count
antecedência para verificar se há algum objeto para retirar da fila. É uma questão de preferência, na verdade.Eu não diria que usar NSMutableArray é necessariamente a melhor solução, particularmente se você estiver adicionando métodos com categorias, devido à fragilidade que eles podem causar se os nomes dos métodos colidirem. Para uma fila rápida e suja, eu usaria os métodos para adicionar e remover no final de um array mutável. No entanto, se você planeja reutilizar a fila, ou se deseja que seu código seja mais legível e evidente, uma classe de fila dedicada é provavelmente o que você deseja.
O Cocoa não tem um integrado, mas existem outras opções, e você também não precisa escrever um do zero. Para uma fila verdadeira que apenas adiciona e remove das extremidades, uma matriz de buffer circular é uma implementação extremamente rápida. Confira CHDataStructures.framework , uma biblioteca / framework em Objective-C que venho trabalhando. Ele tem uma variedade de implementações de filas, bem como pilhas, deques, conjuntos classificados, etc. Para seus propósitos, CHCircularBufferQueue é significativamente mais rápido (ou seja, comprovável com benchmarks) e mais legível (admitidamente subjetivo) do que usar um NSMutableArray.
Uma grande vantagem de usar uma classe Objective-C nativa em vez de uma classe STL C ++ é que ela se integra perfeitamente ao código Cocoa e funciona muito melhor com codificação / decodificação (serialização). Também funciona perfeitamente com coleta de lixo e enumeração rápida (ambos presentes no 10.5+, mas apenas o último no iPhone) e você não precisa se preocupar com o que é um objeto Objective-C e o que é um objeto C ++.
Por último, embora NSMutableArray seja melhor do que um array C padrão ao adicionar e remover de qualquer extremidade, também não é a solução mais rápida para uma fila. Para a maioria dos aplicativos, é satisfatório, mas se você precisar de velocidade, um buffer circular (ou, em alguns casos, uma lista vinculada otimizada para manter as linhas de cache quentes) pode facilmente derrubar um NSMutableArray.
fonte
Até onde eu sei, Objective-C não fornece uma estrutura de dados Queue. Sua melhor aposta é criar um
NSMutableArray
e, em seguida[array lastObject]
, usar[array removeLastObject]
para buscar o item e[array insertObject:o atIndex:0]
...Se você está fazendo muito isso, pode criar uma categoria Objective-C para estender a funcionalidade da
NSMutableArray
classe. As categorias permitem adicionar funções dinamicamente a classes existentes (mesmo aquelas para as quais você não tem a fonte) - você pode fazer uma fila como esta:(NOTA: Este código é, na verdade, para uma pilha, não uma fila. Veja os comentários abaixo)
fonte
Não há nenhuma classe de coleção de fila real, mas NSMutableArray pode ser usado efetivamente para a mesma coisa. Você pode definir uma categoria para adicionar métodos pop / push como uma conveniência, se desejar.
fonte
Sim, use NSMutableArray. NSMutableArray é realmente implementado como árvore 2-3; você normalmente não precisa se preocupar com as características de desempenho de adicionar ou remover objetos do NSMutableArray em índices arbitrários.
fonte
re: Wolfcow - Aqui está uma implementação corrigida do método de desenfileiramento do Wolfcow
fonte
As soluções que usam uma categoria em
NSMutableArray
não são filas verdadeiras, porqueNSMutableArray
expõe operações que são um superconjunto de filas. Por exemplo, você não deve ter permissão para remover um item do meio de uma fila (como essas soluções de categoria ainda permitem). É melhor encapsular a funcionalidade, um princípio importante do design orientado a objetos.StdQueue.h
StdQueue.m
fonte
esta é a minha implementação, espero que ajude.
É meio minimalista, então você deve manter o controle da cabeça salvando a nova no pop e descartando a velha
fonte
Existe algum motivo específico pelo qual você não pode simplesmente usar a fila STL? Objective C ++ é um superconjunto de C ++ (apenas use .mm como extensão em vez de .m para usar Objective C ++ em vez de Objective C). Então você pode usar o STL ou qualquer outro código C ++.
Um problema de usar a fila / vetor / lista STL etc. com objetos Objective C é que eles normalmente não suportam gerenciamento de memória de retenção / liberação / liberação automática. Isso é facilmente contornado com uma classe de contêiner C ++ Smart Pointer que retém seu objeto Objective C quando construído e o libera quando destruído. Dependendo do que você está colocando na fila STL, isso geralmente não é necessário.
fonte
Use NSMutableArray.
fonte