gpt4 book ai didi

c++ - 有人知道模仿 Pascal 的 "range array"的类吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:52:01 26 4
gpt4 key购买 nike

我不记得确切的名字 - 我几乎不记得关于 Pascal 的很多东西 - 但它只是一个数组,它做了一些边界检查,所以你可以定义和使用这样的东西:

char arr[20..40];

如果您访问元素 15 或 60,它会抛出越界异常。

在 C++ 中,我认为它看起来更像

vector<char> arr(20,40);

这对于 C++ 数组的类包装器来说非常简单,但我希望有人知道使用 vector 的东西。理想情况下,如果 (1) 调用 setter 或 (2) 并进行插入/删除但 (3) 尝试访问无效元素仍然引发异常,我正在寻找范围(和大小)会动态变化的东西。

arr.setUpper(50);

arr.push_back(element);  //adjust upper array bound

我还没有跟上 C++11 数组的速度,所以也许他们已经在做类似的事情了?

最佳答案

C++ 数组根本不支持像 Pascal 那样的自定义边界。它们总是从索引 0 开始,到索引 length-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

关于c++ - 有人知道模仿 Pascal 的 "range array"的类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13275272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com