Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

Массив без выхода за пределы C++

#cpp #массивы #алгоритм


Мне нужно массив или вектор без выхода за пределы.
Что это такое? допустим 
Создаю вектор или массив на 10 символов типа int
Все 10 элементов равны 10
когда беру a[0],a[4],a[9] == 10;
но как сделать так что бы 

a[10 (это 0) ] == 10 
a[12 (это 2) ] == 10


желательно ещё для отрицательных чисел   
    


Ответы

Ответ 1



Если вопрос в том, как получить индекс, не выходящий за пределы массива при отрицательных индексах, то можно индекс массива вычислять так: i < 0 ? -i%10 : i % 10 Например: #include using namespace std; int main() { int a[10] = {1,2,3,4,5,6,7,8,9,10}; for(int i=-12; i<12; ++i){ cout << "a[" << i << "] = " << a[i < 0 ? -i%10 : i % 10] << endl; } return 0; } На выходе будет: a[-12] = 3 a[-11] = 2 a[-10] = 1 a[-9] = 10 a[-8] = 9 a[-7] = 8 a[-6] = 7 a[-5] = 6 a[-4] = 5 a[-3] = 4 a[-2] = 3 a[-1] = 2 a[0] = 1 a[1] = 2 a[2] = 3 a[3] = 4 a[4] = 5 a[5] = 6 a[6] = 7 a[7] = 8 a[8] = 9 a[9] = 10 a[10] = 1 a[11] = 2

Ответ 2



Создайте свой класс и перегрузите в нем operator[] (я сделаю здесь в виде шаблона): template class Array { private: T *arr; int size; public: Array(uint _size = 10); //по умолчанию размер массива = 10; ~Array(); T& operator[](uint index); } template Array::Array(uint _size) { if (_size == 0) { _size = 1; } arr = new T[_size]; } template Array::~Array() { delete [] arr; } template T& Array::operator[](uint _index) { _index %= size; return arr[_index]; } NB Возможно где то накосячил, так как давно не писал на плюсах, но принцип должен быть понятен.

Ответ 3



Вообще, выходить за пределы выделяемой памяти не рекомендуется, может возникнуть ошибка segmentation fault. Вы можете создать иллюзию на такой массив, к примеру, создать класс которое заранее забронирует определенное количество мест в массиве. class SomeArrayInt { int *a; public SomeArrayInt() { a = new int[1000]; n = 1000; for(size_t i = 0; i < n; i++) a[i] = 10; } int operator[](int k) { if(n < k) { delete [] a; a = new int[k]; n = k; for(size_t i = 0; i < n; i++) a[i] = 10; } return a[k - 1]; } ~SomeArrayInt() { delete [] a; } } Может ошибся где нить, но по идее как то так.

Комментариев нет:

Отправить комментарий