有人知道一个模仿帕斯卡"range array"的类吗?
Anyone know of a class that mimics Pascal's "range array"?
我不记得确切的名称 - 我几乎不记得帕斯卡尔(Pascal) - 但这只是一个数组进行了一些界限检查,因此您可以定义并使用类似的东西:
char arr[20..40];
,如果您访问了15或60的元素,它将引发异常。
在C 中,我认为它看起来更像
vector<char> arr(20,40);
这很容易与C 阵列周围的类包装器一起处理,但我希望有人知道使用矢量的东西。理想情况下,我正在寻找范围(和大小)将动态变化的东西,如果(1)拨打了一个设置器或(2)和插入/删除,但是(3)尝试访问无效元素的尝试仍然引发了例外。/p>
arr.setUpper(50);
和
arr.push_back(element); //adjust upper array bound
我还没有加快C 11数组的速度,所以也许他们已经做了这样的事情?
c 数组根本不像帕斯卡(Pascal)那样支持自定义界限。它们总是以索引0开始,并以索引长度为1结束。如果您想要类似帕斯卡的索引,则必须自己实施,例如:
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
std::vector::at
将执行边界检查,如果使用无效的位置,将抛出std::out_of_range
类型的例外。operator[]
不执行界限检查。
在您的示例中,vector<char> arr(20,40)
将构造20个整数的向量,值为40。这被称为重复序列构造函数。
相关文章:
- C++:试图通过组合和帕斯卡三角形来理解constexpr
- 如何在C++的帕斯卡三角形中打印曲棍球棒的元素?
- CUDA - 统一内存(至少是帕斯卡)
- 找到一个数字平方和是质数(帕斯卡或C++)的数字
- 有人知道一个模仿帕斯卡"range array"的类吗?
- 找到第1500行帕斯卡三角形中的每个数字
- 需要使用帕斯卡三角形 (x+y) 打印二项式系数
- 帕斯卡三角形程序 C++ 上的间距
- 为什么我在计算帕斯卡三角形元素时在递归 C 程序中出现堆栈溢出错误
- C++:如何生成帕斯卡三角形的'nth'线?
- 从C++打电话给斯卡拉帕克
- 帕斯卡三角形|李特码错误答案
- 帕斯卡三角形实现
- 帕斯卡的模数
- 以C++为中心帕斯卡三角形输出
- 帕斯卡的读密钥是否有等效项;在 C 还是C++?
- 我如何解释这个帕斯卡部分C++
- 为什么这个帕斯卡三角形程序不起作用?
- c++生成帕斯卡三角形,输出错误
- C++:帕斯卡三角形 - 奇怪的结果