我从一些算法书籍中读到了一个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
//...
}
Run Code Online (Sandbox Code Playgroud)
可疑部分是数据({cap}),这是什么?它将矢量调整为容量上限?(显然,代码的作者打算在构造数据时给出数据大小.)
编辑:在阅读第一个答案和测试后,我们知道该书在代码段中有错误.它打算给出一个初始上限,但它使用了错误的{}.
这就是统一初始化,C++11 的一项新功能。但是,可以说在您的示例中以正确的方式使用了它。它应该是:
Queue(const size_t &cap=8) : head(0),tail(0),count(0),data(cap) {}
// ^^^^^
Run Code Online (Sandbox Code Playgroud)
因为目的是调用std::vector<>接受向量初始大小的构造函数。这样调用它:
data{cap}
Run Code Online (Sandbox Code Playgroud)
或者这样:
data({cap})
Run Code Online (Sandbox Code Playgroud)
导致接受 an 的构造函数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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4070 次 |
| 最近记录: |