2

正確な名前は覚えていません-Pascalについてはほとんど覚えていません-しかし、これは境界チェックを行った配列であり、次のように定義して使用できます。

char arr[20..40];

また、要素15または60にアクセスすると、範囲外の例外がスローされます。

C ++では、次のようになります。

vector<char> arr(20,40);

これは、C ++配列のクラスラッパーを使用して行うのは非常に簡単ですが、ベクトルを使用する何かを誰かが知っていることを望んでいました。理想的には、(1)セッターが呼び出された場合、または(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)は、値が40の20個の整数のベクトルを作成します。これは反復シーケンスコンストラクターとして知られています。

于 2012-11-07T18:41:43.130 に答える