Classe C ++ para matrizes com índices arbitrários
Pergunta
Alguma das bibliotecas C ++ populares possuem uma classe (ou classes) que permitem ao desenvolvedor usar matrizes com índices arbitrários sem sacrificar a velocidade?
Para dar essa pergunta mais concreta, gostaria da possibilidade de escrever código semelhante ao abaixo:
//An array with indices in [-5,6)
ArbitraryIndicesArray<int> a = ArbitraryIndicesArray<int>(-5,6);
for(int index = -5;index < 6;++index)
{
a[index] = index;
}
Solução
Realmente você deve estar usando um vetor com um deslocamento. Ou mesmo uma matriz com um deslocamento. A adição ou subtração extra não fará nenhuma diferença na velocidade de execução do programa.
Se você quiser algo com exatamente a mesma velocidade que uma matriz C padrão, você pode aplicar o deslocamento ao ponteiro da matriz:
int* a = new int[10];
a = a + 5;
a[-1] = 1;
No entanto, não é recomendado. Se você realmente deseja fazer isso, deve criar uma classe de wrapper com funções embutidas que oculam o código horrível. Você mantém a velocidade do código C, mas acaba com a capacidade de adicionar mais verificação de erros.
Como mencionado nos comentários, depois de alterar o ponteiro da matriz, você não pode excluir o uso desse ponteiro. Você deve redefini -lo para o início real da matriz. A alternativa é que você sempre mantém o ponteiro para o início, mas trabalha com outro ponteiro modificado.
//resetting the array by adding the offset (of -5)
delete [] (a - 5);
Outras dicas
UMA std::vector<int>
Faria o truque aqui.
O acess aleatório para um único elemento em um vetor é apenas O (1).
Se você realmente precisar dos índices personalizados, poderá fazer sua própria classe pequena com base em um vetor para aplicar um OFSet.
Use a classe de mapa do STL:
std::map<int, int> a;
for( int index = -5; index < 6; ++index )
{
a[index] = index;
}
O mapa é implementado internamente como um contêiner classificado, que usa uma pesquisa binária para localizar itens.
Este é um tópico antigo, mas por causa de referência ...
Boost.multiarray tem um sistema de extensões para definir qualquer intervalo de índice.
As matrizes no Objexxxfcl A biblioteca tem suporte total para intervalos de índices arbitrários.
Estas são bibliotecas de matriz multidimensional. Para a matriz OP 1D, o Wrapper STD :: Vector acima deve ser suficiente.
Resposta editada porque não sou muito inteligente.
Enrole um std::vector
e um deslocamento em uma classe e fornecer um operator[]
:
template <class T>
class ArbVector
{
private:
int _offset;
std::vector<T> container;
public:
ArbVector(int offset) : _offset(offset) {}
T& operator[](int n) { return container[n + _offset] }
};
Não tenho certeza se isso compila, mas você entendeu.
Não deriva de std::vector
Porém, veja comentários.