2

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

char arr[20..40];

如果您访问元素 15 或 60,它将引发越界异常。

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

vector<char> arr(20,40);

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

arr.setUpper(50);

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

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

4

2 回答 2

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
于 2012-11-07T19:24:58.383 回答
1

std::vector::at将执行边界检查std::out_of_range,如果使用了无效的位置,则会引发类型异常。operator[]不执行边界检查。

在您的示例中,vector<char> arr(20,40)将构造一个由 20 个整数组成的向量,其值为 40。这称为重复序列构造函数。

于 2012-11-07T18:41:43.130 回答