2013-04-08 13 views
7

いくつかのアルゴリズムの書籍からQueueの実装を読みましたが、私が理解していない新しい/興味深いスニペットがあります。私はそれがC++ 11のベクタの初期化リストのような新しいものだと思いますが、コードのコンテキストのために自信がありません。誰かが光を当てたり、参考にすることはできますか?C++のコンストラクタの中かっこのパラメータは何ですか?

template <typename T> 
class Queue { 
    private: 
     size_t head, tail, count; 
     vector<T> data; 
    public: 
     Queue(const size_t &cap=8) : head(0),tail(0),count(0),data({cap}) {} 
     //... more interfaces 
     //... 
} 

疑問部分はデータ({cap})ですが、これは何ですか?それはキャップの容量にベクトルのサイズを変更しますか? (明らかに、コードの作成者は、データを作成するときに上限を与えることを意図しています)。

EDIT: 最初の回答とテストを読んだ後で、本はスニペットにエラーがあることがわかりました。それは最初のキャップを与えるつもりですが、誤った{}が使われました。

+0

http://en.cppreference.com/w/cpp/utility/initializer_list – BoBTFish

+5

[C++ 11ファンイニシャライザリスト、配列、列挙型](http://stackoverflow.com/questions/8606315/c11-fun-with-initializer-lists-arrays-and-enumerations)を参照してください。質問をする前に、おそらくC++リファレンスを調べるべきです。基本的な構文の質問はそのように答えることができます。 –

+0

私が間違っていない場合、 '{cap}'は空のサイズ8のリストにする必要があります。デフォルトの長さ8 ...またはリスト8で初期化しますので、これで終わります。 – Shark

答えて

4

つまり、均一初期化、新しいC++ 11の機能です。しかし、あなたの例では間違いなく正しい方法で使用されています。それは次のようになります。

Queue(const size_t &cap=8) : head(0),tail(0),count(0),data(cap) {} 
//              ^^^^^ 

意図はベクトルの初期サイズを受け入れるstd::vector<>のコンストラクタを呼び出すことであるため。このようにそれを呼び出す:

data{cap} 

またはこの方法:

data({cap}) 

を採取するstd::initializer_listを受け入れるコンストラクタを引き起こす(初期化子リストは初期化を引き締めるためにC++ 11、緊密に関連する別の新機能です)、値がcapの1つの要素でベクトルが初期化されます。

このlive example(コードを以下に報告されている)上記請求を検証することができる:

#include <vector> 

struct X 
{ 
    X(int s) : v1({s}), v2{s}, v3(s) { } 
    std::vector<int> v1; 
    std::vector<int> v2; 
    std::vector<int> v3; 
}; 

#include <iostream> 

int main() 
{ 
    X x(42); 
    std::cout << x.v1.size() << std::endl; // Prints 1 
    std::cout << x.v2.size() << std::endl; // Prints 1 
    std::cout << x.v3.size() << std::endl; // Prints 42 
} 
+0

私はOPの例から 'cap'を見て、' {cap} 'は' 8要素の空のリスト 'または' 8つの要素からなるリスト 'を参照していますか? :) – Shark

+0

@Shark:それは値が '8'である1要素を含むイニシャライザリストです:) –

+0

これはC++であると元々期待していたことではありません....:D – Shark

関連する問題