C ++ класс для массивов с произвольными индексами

StackOverflow https://stackoverflow.com/questions/2312129

  •  22-09-2019
  •  | 
  •  

Вопрос

Есть ли какие -либо популярные библиотеки C ++ есть класс (или классы), которые позволяют разработчику использовать массивы с произвольными индексами, не жертвуя скоростью?

Чтобы дать этот вопрос более конкретную форму, мне бы хотелось написать код, аналогичный ниже:

//An array with indices in [-5,6)
ArbitraryIndicesArray<int> a = ArbitraryIndicesArray<int>(-5,6);  
for(int index = -5;index < 6;++index)
{
    a[index] = index;
}
Это было полезно?

Решение

На самом деле вы должны использовать вектор с смещением. Или даже массив с смещением. Дополнительное дополнение или вычитание не будет иметь никакого значения для скорости выполнения программы.

Если вы хотите что -то с той же скоростью, что и массив C по умолчанию, вы можете применить смещение к указателю массива:

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

Однако это не рекомендуется. Если вы действительно хотите сделать это, вы должны создать класс обертки с встроенными функциями, которые скрывают ужасный код. Вы сохраняете скорость кода C, но в конечном итоге получаете возможность добавить больше проверки ошибок.

Как упоминалось в комментариях, после изменения указателя массива вы не можете удалить, используя этот указатель. Вы должны сбросить его до фактического начала массива. Альтернативой является то, что вы всегда сохраняете указатель к началу, но работаете с другим измененным указателем.

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

Другие советы

А std::vector<int> Сделал бы здесь.
Случайная Acess к одному элементу в векторе составляет только O (1).

Если вам действительно нужны пользовательские индексы, вы можете сделать свой собственный небольшой класс на основе вектора для применения установки.

Используйте класс карты из STL:

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

Карта реализована внутри как отсортированный контейнер, который использует двоичный поиск для поиска элементов.

Это старая нить, но для справочного саке ...

Boost.multiarray Имеет существу систему для установки любого диапазона индексов.

Массивы в Objexxfcl Библиотека имеет полную поддержку для произвольных диапазонов индексов.

Это оба многомерные библиотеки массива. Для массива OP 1D нужен должен быть достаточно векторной обертки выше.

Ответ отредактирован, потому что я не очень умный.

Обернуть std::vector и смещение в класс и обеспечить 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] }
};

Не уверен, что это компилизируется, но вы поняли идею.

Не выходить из std::vector Хотя см. Комментарии.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top