[英]C++ : STL Container adapters
在下面的代码中,使用基础容器将“第二”初始化为双端队列和“第四”的副本。 如果有人可以向我解释,何时初始化为容器的副本以及何时使用基础容器,我感到很高兴。
#include <iostream> // std::cout
#include <deque> // std::deque
#include <list> // std::list
#include <queue> // std::queue
int main ()
{
std::deque<int> mydeck (3,100); // deque with 3 elements
std::list<int> mylist (2,200); // list with 2 elements
std::queue<int> first; // empty queue
std::queue<int> second (mydeck); // queue initialized to copy of deque
std::queue<int,std::list<int> > third;
std::queue<int,std::list<int> > fourth (mylist);
std::cout << "size of first: " << first.size() << '\n';
std::cout << "size of second: " << second.size() << '\n';
std::cout << "size of third: " << third.size() << '\n';
std::cout << "size of fourth: " << fourth.size() << '\n';
return 0;
}
何时初始化为容器的副本以及何时使用基础容器?
这两个...
std::queue<int> second(mydeck);
std::queue<int,std::list<int> > fourth(mylist);
...通过复制指定为构造函数参数的容器中的元素来构造和初始化队列(分别是mydeck
和mylist
)。
如果要问为什么第二个参数指定第二个模板参数std::list<int>
,那是因为std::queue
可以将数据存储在提供期望的API函数的任何容器中。 从cppreference中 ,第二个模板参数为:
容器 -用于存储元素的基础容器的类型。 容器必须满足
SequenceContainer
的要求。 此外,它必须提供具有通常语义的以下功能:
back()
front()
push_back()
pop_front()
标准容器std :: deque和std :: list满足这些要求。
其中,我猜想std::list
通常对于一个或很少几个元素会更高效(确切的说,临界值取决于对象大小,内存库性能特征,CPU缓存大小,系统负载等。-变得复杂),然后std::deque
对于大量元素(具有更少但更大的动态内存分配/释放)将具有更好的平均性能和内存使用率。 但是对于某些特定的用例,即使是经过深思熟虑的猜测也可能会犯下严重的错误-如果您足够关心以进行调整,则应该使用每个候选容器以及您的实际数据和使用情况来衡量性能,以做出决定。 将容器作为模板参数可以使程序员选择最适合其需求的东西。
该参数还具有默认值...
template <class T, class Container = std::deque<T>> class queue;
...因此,如果您不愿意使用std::deque
则只需显式指定一个容器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.