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;
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top