2013-04-08 8 views
7

Czytam implementację kolejki z niektórych książek algorytmu, istnieje nowy/interesujący mnie fragment, którego nie rozumiem. Myślę, że jest to coś nowego jak lista inicjalizacyjna dla wektora w C++ 11, ale nie jestem pewny ze względu na kontekst kodu. Czy ktoś może rzucić światło lub podać jakieś odniesienie?Co to jest parametr nawias klamrowy w konstruktorze 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 
     //... 
} 

Częścią budzącą wątpliwości są dane ({cap}), co to jest? Zmienia rozmiar wektora na wielkość czapki? (Oczywiście autor kodu zamierza podać dane o wielkości przykrywki podczas konstruowania.)

EDYCJA: po przeczytaniu pierwszej odpowiedzi i testu wiemy, że książka zawierała błąd we fragmencie. Zamierza podać początkowy pułap, ale użył błędnego {}.

+0

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

+5

[C++ 11 Fun z listami inicjatora, tablicami i wyliczeniami] (http://stackoverflow.com/questions/8606315/c11-fun-withinitializer-lists-arrays-and-enumerations). Powinieneś prawdopodobnie skonsultować się z referencją C++ przed zadawaniem pytań. Na podstawowe pytania dotyczące składni można odpowiedzieć w ten sposób. –

+0

'{cap}' powinno być pustą listą o rozmiarze 8, jeśli się nie mylę; więc zainicjuje go z domyślną długością 8 .... lub listą z elementem 8, więc skończysz z tym. – Shark

Odpowiedz

4

To jest jednolita inicjalizacja, nowa funkcja C++ 11. Jednak jest to prawdopodobnie używane we właściwy sposób na twoim przykładzie. Powinno być:

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

Ponieważ intencją jest, aby wywołać konstruktor std::vector<> który akceptuje początkową wielkość wektora. Powołując się to w ten sposób:

data{cap} 

Or w ten sposób:

data({cap}) 

powoduje konstruktor przyjmujący std::initializer_list do odbioru (listy initializer to kolejna nowa funkcja C++ 11, ściśle związane z klamra inicjalizacji), w wyniku czego wektor inicjalizowany jest z jednym pojedynczym elementem, którego wartość wynosi cap.

można zweryfikować powyższe roszczenie w tej live example (kod zostanie zgłoszony poniżej):

#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

Muszę zapytać - patrząc na 'cap' z przykładu OP, czy' {cap} 'odnosi się do' pustej listy 8 elementów' lub 'listy składającej się z jednego 8 elementu'? :) – Shark

+0

@Shark: To lista inicjalizatorów zawierająca 1 element, którego wartość to '8' :) –

+0

To nigdy nie było to, czego początkowo oczekiwałeś z C++. Jest to ...: D – Shark

Powiązane problemy