2013-04-08 99 views
7

我從某些算法書籍中讀取了Queue的實現,有一段對我來說是新的/有趣的片段,我不明白。我認爲這是C++ 11中向量初始化列表的新東西,但由於代碼的上下文我沒有那麼自信。任何人都可以擺脫燈光或提供一些參考?什麼是C++構造函數中的大括號參數11

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}),這是什麼?它將矢量調整到cap容量? (顯然,代碼的作者打算建造時,它給數據帽的大小。)

編輯: 閱讀第一答案和測試後,我們知道,這本書中摘錄了錯誤。它打算給出一個初始上限,但它使用錯誤{}。

+0

http://en.cppreference.com/w/cpp/utility/initializer_list – BoBTFish 2013-04-08 15:51:57

+5

[C++ 11趣味與初始化列表,數組和枚舉](http://stackoverflow.com/questions/8606315/c11-fun-with-initializer-lists-arrays-and-enumerations)。在提出問題之前,您應該先諮詢C++參考。基本的語法問題可以這樣回答。 – 2013-04-08 15:52:26

+0

如果我沒有弄錯,{cap}應該是大小爲8的空列表;所以它會初始化它,默認長度爲8 ....或者元素爲8的列表,所以你最終會得到這個結果。 – Shark 2013-04-08 15:55:46

回答

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

可以驗證在該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 2013-04-08 15:57:21

+0

@Shark:這是一個包含1個元素的初始值設定項列表,它的值是'8':) – 2013-04-08 15:58:46

+0

從來沒有你最初期望它與C++是一樣的......:D – Shark 2013-04-08 15:59:30

相關問題