7

いくつかのアルゴリズムの本から Queue の実装を読みましたが、理解できなかった新しい/興味深いスニペットがあります。C++11 の vector の初期化リストのような新しいものだと思いますが、コードのコンテキストから自信がありません。誰でも光を当てたり、参照を提供したりできますか?

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
        //...
}

問題の部分は data({cap}) ですが、これは何ですか? ベクターのサイズを cap? の容量に変更します。(明らかに、コードの作成者は、データを構築するときに上限のサイズをデータに与えるつもりです。)

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

4

1 に答える 1

4

これはC++11 の新機能である一様初期化です。ただし、間違いなく、あなたの例では正しい方法で使用されています。そのはず:

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

std::vector<>ベクトルの初期サイズを受け入れるコンストラクターを呼び出すことが意図されているためです。次のように呼び出します。

data{cap}

またはこの方法:

data({cap})

anstd::initializer_listを受け入れるコンストラクターが選択されるようにします (イニシャライザー リストは C++11 のもう 1 つの新機能であり、ブレースの初期化と密接に関連しています)、結果として、値が である 1 つの要素で初期化されたベクターが生成されますcap

この実際の例で上記の主張を確認できます(コードは以下に報告されています)。

#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
}
于 2013-04-08T15:55:33.957 に答える