Мне нужно массив или вектор без выхода за пределы. Что это такое? допустим Создаю вектор или массив на 10 символов типа int Все 10 элементов равны 10 когда беру a[0],a[4],a[9] == 10; но как сделать так что бы
a[10 (это 0) ] == 10
a[12 (это 2) ] == 10
желательно ещё для отрицательных чисел
Создайте свой класс и перегрузите в нем operator[]
(я сделаю здесь в виде шаблона):
template <typename T>
class Array
{
private:
T *arr;
int size;
public:
Array(uint _size = 10); //по умолчанию размер массива = 10;
~Array();
T& operator[](uint index);
}
template <typename T>
Array<T>::Array(uint _size)
{
if (_size == 0) { _size = 1; }
arr = new T[_size];
}
template <typename T>
Array<T>::~Array()
{
delete [] arr;
}
template <typename T>
T& Array<T>::operator[](uint _index)
{
_index %= size;
return arr[_index];
}
NB Возможно где то накосячил, так как давно не писал на плюсах, но принцип должен быть понятен.
Если вопрос в том, как получить индекс, не выходящий за пределы массива при отрицательных индексах, то можно индекс массива вычислять так:
i < 0 ? -i%10 : i % 10
Например:
#include <iostream>
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
Вообще, выходить за пределы выделяемой памяти не рекомендуется, может возникнуть ошибка 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;
}
}
Может ошибся где нить, но по идее как то так.
Виртуальный выделенный сервер (VDS) становится отличным выбором
После удаления и попытки новой установки, выдаёт ошибку
Какой самый простой способ чтения бинарного файла вместе со всеми его байтами (нулевыми тоже) в unsigned char массив и при этом узнать его длину?