2011-07-08 1 views
6

ベクトルのサイズを固定して内容を変更する方法はありますか?std :: vectorのサイズを固定(ロック)

constベクトルconst std::vector<int> vec(10);を作成しようとしましたが、値を変更できません。

vec[3] = 3;は、読み取り専用の場所の割り当てというコンパイラエラーを示します。

Iはまた、非constベクトル同じコンパイラエラーを与える

std::vector<int> vec(10); 
const std::vector<int>& vecref(vec); 

にconst参照して試みました。

私は、宣言時または初期化段階の後にベクトルサイズを修正できるようにします。旧式の配列を使うこともできますが、ベクトルアルゴリズムを使用できるようにしたいと考えています。

私はg ++を使用しています。違いがあれば。

+1

"ベクトルアルゴリズムは、" 使用したいですか?固定サイズのstd :: vectorで動作する ' 'の中には、コンテナではなくイテレータを扱うため、普通の配列で動作します。 –

+0

私は 'find_if'、' for_each'などを使用しています。私は普通の配列でそれらを使うことができるのか分からなかった。 – DanS

+0

ここに納得のいく答えがある場合は、1つを受け入れるべきです:) –

答えて

3

許可する操作のみを提供するオブジェクトに埋め込みます。

乾杯& HTH。、

1

あなたはconst vector of pointersを作り、彼らが指すオブジェクトを変更することができます。これが正解です。それは可能です。

1

boost.array,を見てください。配列のサイズを変更するものを除いて、ベクトルセマンティクスを持つ固定サイズの配列を提供します。

+0

"vector semantics"は間違いであり、間違っています。 push_back、pop_back、resizeなどはboost.arrayではサポートされていません。 –

+0

@phresnel:はい、もちろんです。配列の固定サイズの性質を強化するために編集されました。 – Ferruccio

+1

公平なpush_backは、定義の意味で配列のサイズを変更するので、ポスターの質問に対する*すべての回答ではサポートできませんでした。 – jcoder

6

C++ 0xでは、std :: array <>を使用できます。これは古い配列と似ていて、STLコンテナという利点があり、多くのstd ::アルゴリズムが可能です。

また、boost :: arrayを試してみることもできます。

std::tr1::array<>もあることに注意してください。その後

Actually, one of the cases that I hadn't gone into was to grow the vector while reading configuration files and then fix the size after that - DanS

、なぜこの(イラスト)ない::編集


#include <vector> 

int main() { 
    std::vector<int> foo; 

    /* ... crunch upon foo ... */ 

    // make a copy vector->vector: 
    const std::vector<int> bar (foo); 

    // make a copy any->vector 
    const std::vector<int> frob (foo.begin(), foo.end()); 
} 

また、あなたは)(セマンティクスをリセットする必要がありますが、(サイズを変更禁止にする場合)らあなたはコンテナアダプタを書くことができます:

template <typename T, typename Allocator = allocator<T> > 
class resettable_array { 
public: 
    // container ... 
    typedef typename std::vector<T,Allocator>::iterator iterator; 
    typedef typename std::vector<T,Allocator>::const_iterator const_iterator; 
    ... 

    iterator begin() { return vector_.begin() } 
    const_iterator begin() const { return vector_.begin(); } 
    ... 

    void push_back (T const &v) { vector_.push_back (v); } 
    ... 

    // custom 
    void reset() { ... } 

private: 
    std::vector<T,Allocator> vector_; 
}; 

参照:

+0

C++ 11のもう一つの利点は 'std :: begin'と' std :: end'です。これは 'int [5]'のような古い標準の固定長配列でも動作します。 std :: algorithm'と 'std :: numeric'を比較します。 –

関連する問題