vector宣言時の長さプリセット

4220 ワード

vector宣言時の長さプリセット
  • メソッド1はvectorのメンバー関数reserveを用いて実現される.クラスの宣言ではreserve関数を直接呼び出すことはできません.宣言時にメモリが割り当てられていないため、関数操作はできません.クラスの構造関数で実現できます.
  • //   
    class Foo 
    {
        public:
            vector<int> init_vec;
        Foo();
        ~Foo();
    };
    //   
    Foo::Foo(){init_vec.reserve(3)}         // init_vec       3 ----   1
    
  • 法2の最も簡単な方法はvectorを使用するときに関数を構築することによって実現される.次はvectorコンテナクラスの5つの一般的な構造関数です.
  • //vector         
    
        // 0. Create an empty vector v0  
        std::vector<int> v0;  
    
        // 1. Create a vector v1 with 3 elements of default value 0  
        std::vector<int> v1(3);  
    
        // 2. Create a vector v2 with 5 elements of value 2  
        std::vector<int> v2(5, 2);  
    
        // 3. Create a vector v3 with 3 elements of value 1 and with the allocator of vector v2  
        std::vector<int> v3(3, 1, v2.get_allocator());  
    
        // 4. Create a copy, vector v4, of vector v2  
        std::vector<int> v4(v2);  
    
        // 5. Create a vector v5 by copying the range v4[_First, _Last)  
        std::vector<int> v5(v4.begin() + 1, v4.begin() + 3);  
    

    なお、方法2を用いてvectorによる2次元配列の構造を実現することも可能であり、以下はコード例である.
    std::vector> 2D_array(3,vector(4));
    

    実現したのは3×4の2 D配列.構築プロセスは次のとおりです.2 Dベクトル2 D_を作成します.arrayは、3つの要素を含み、各要素はint型要素のベクトルを4つ含む.コンパイラがvectorを2回呼び出したコンストラクタ構築オブジェクト2 D_Arrayは、構造関数を初めて呼び出して、0を4つ含む無名のvectorオブジェクトを構築しました.
    [0]
    [1]
    [2]
    [3]
    0
    0
    0
    0
    2回目の呼び出しコンストラクション関数はvectorの3つの要素を無名のvectorオブジェクトで初期化します.
  • メソッド3一部のコンテナでは事前に長さを予め設定できない場合があり、再使用可能な場合は判断文を加えることができます.
  • //    
    int main()
    {
       std::queue<int> init_que;
        for(int i=0;i<10;i++)
            {
                init_que.push(i);
                if(init_que.size() == 8)        //         init_que      8
                    {
                        break;
                    }
            }
    }
    

    PS:メソッド2を用いるvectorの長さを予め設定する場合、メカニズムは空間を割り当てて0に初期化する.すなわち、メソッド2の使用後、そのメンバ関数empty()を使用する場合、vectorは常に満タンである、vector.empty()はずっと1.具体的な応用シーンでは,この方法では判断できない.