7

我从一些算法书籍中阅读了 Queue 的实现,有一个片段对我来说是新的/有趣的,但我不明白。我认为这是新的东西,比如 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}),这是什么?它将向量的大小调整为上限?(很明显,代码的作者打算在构造数据时给数据一个大小。)

编辑:阅读第一个答案和测试后,我们知道这本书的片段中有错误。它打算给出一个初始上限,但它使用了错误的 {}。

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})

导致构造函数接受一个std::initializer_list被选取(初始化列表是 C++11 的另一个新特性,与大括号初始化密切相关),导致一个向量初始化为一个值为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 回答