我不记得确切的名字 - 我几乎不记得Pascal - 但它只是一个数组做了一些边界检查,所以你可以定义和使用这样的东西:
char arr[20..40];
如果你访问了元素15或60,它会抛出一个越界异常。
在C ++中,我认为它看起来更像是
vector<char> arr(20,40);
这对使用C ++数组的类包装器非常简单,但我希望有人知道使用了向量的东西。理想情况下,我正在寻找范围(和大小)将动态改变的东西,如果(1)调用setter或(2)并且插入/删除但是(3)尝试访问无效元素仍然引发异常。< / p>
arr.setUpper(50);
和
arr.push_back(element); //adjust upper array bound
我还没有达到C ++ 11阵列的速度,所以他们可能会做这样的事情吗?
答案 0 :(得分:2)
C ++数组根本不支持像Pascal那样的自定义边界。它们始终从索引0开始,以索引长度-1结束。如果你想要类似Pascal的索引,你必须自己实现它,例如:
template<typename T, const int LowBound, const int HighBound>
class RangedArray
{
private:
T m_arr[HighBound-LowBound+1];
void CheckBounds(const int index)
{
if ((index < LowBound) || (index > HighBound))
throw std::out_of_range();
}
public:
int low() const { return LowBound; }
int high() const { return HighBound; }
T operator[](const int index) const
{
CheckBounds(index);
return m_arr[index-LowBound];
}
T& operator[](const int index)
{
CheckBounds(index);
return m_arr[index-LowBound];
}
};
RangedArray<char, 20, 40> arr;
arr[20] // OK
arr[15] // out of bounds
arr[60] // out of bounds
如果您想要更具动感的内容,请尝试以下方法:
template<typename T, const int LowBound>
class RangedVector
{
private:
std::vector<T> m_vec;
void CheckBounds(const int index)
{
if ((index < low()) || (index > high()))
throw std::out_of_range();
}
public:
int low() const { return LowBound; }
int high() const { return m_vec.empty() ? -1 : (LowBound + m_vec.size() - 1); }
void setHighBound(const int HighBound)
{
if (HighBound < LowBound)
throw something;
m_vec.resize(HighBound-LowBound+1);
}
void push_back(const T &value)
{
m_vec.push_back(value);
}
T operator[](const int index) const
{
CheckBounds(index);
return m_vec[index-LowBound];
}
T& operator[](const int index)
{
CheckBounds(index);
return m_vec[index-LowBound];
}
};
RangedVector<char, 20> arr;
arr.setHighBound(40);
arr[20] // OK
arr[15] // out of bounds
arr[60] // out of bounds
答案 1 :(得分:1)
std::vector::at
将执行bounds checking,如果使用了无效的位置,则会抛出类型std::out_of_range
的异常。 operator[]
不执行边界检查。
在您的示例中,vector<char> arr(20,40)
将构造一个20个整数的向量,其值为40.这称为重复序列构造函数。