#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 Например: #includeusing 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[] (я сделаю здесь в виде шаблона): templateclass 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; } } Может ошибся где нить, но по идее как то так.
Комментариев нет:
Отправить комментарий