Pregunta

¿Alguno de las bibliotecas C ++ populares tiene una clase (o clases) que permite al desarrollador usar matrices con índices arbitrarios sin sacrificar la velocidad?

Para dar a esta pregunta una forma más concreta, me gustaría la posibilidad de escribir código similar al siguiente:

//An array with indices in [-5,6)
ArbitraryIndicesArray<int> a = ArbitraryIndicesArray<int>(-5,6);  
for(int index = -5;index < 6;++index)
{
    a[index] = index;
}
¿Fue útil?

Solución

Realmente deberías usar un vector con un desplazamiento. O incluso una matriz con un desplazamiento. La adición o resta Extra no va a hacer ninguna diferencia a la velocidad de ejecución del programa.

Si desea algo con exactamente la misma velocidad que una matriz C predeterminada, puede aplicar el desplazamiento al puntero de la matriz:

int* a = new int[10];
a = a + 5;
a[-1] = 1;

Sin embargo, no se recomienda. Si realmente quieres hacer eso, debes crear una clase de envoltorio con funciones en línea que oculten el código horrible. Mantiene la velocidad del código C pero termina con la capacidad de agregar más verificación de errores.

Como se menciona en los comentarios, después de alterar el puntero de la matriz, no puede eliminar el uso de ese puntero. Debe restablecerlo al inicio real de la matriz. La alternativa es que siempre mantienes el puntero al inicio, pero trabajas con otro puntero modificado.

//resetting the array by adding the offset (of -5)
delete [] (a - 5);

Otros consejos

A std::vector<int> haría el truco aquí.
El acceso aleatorio a un solo elemento en un vector es solo O (1).

Si realmente necesita los índices personalizados, puede hacer su propia clase pequeña basada en un vector para aplicar un OfSet.

Use la clase de mapa del STL:

std::map<int, int> a;
for( int index = -5; index < 6; ++index )
{ 
    a[index] = index; 
}

MAP se implementa internamente como un contenedor ordenado, que utiliza una búsqueda binaria para localizar elementos.

Este es un hilo antiguo pero por amor de referencia ...

Boost.multiarray tiene un sistema extenso para establecer cualquier rango de índice.

Las matrices en el Objexxfcl La biblioteca tiene soporte completo para rangos de índice arbitrarios.

Estas son bibliotecas de matriz multidimensionales. Para la matriz OP 1D necesita el envoltorio STD :: Vector anterior debería ser suficiente.

Respuesta editada porque no soy muy inteligente.

Envolver un std::vector y un desplazamiento en una clase y proporcionar un 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] }
};

No estoy seguro de si esto se compila, pero se entiende la idea.

No deriva de std::vector Sin embargo, vea los comentarios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top