繁体   English   中英

C ++:STL容器适配器

[英]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);

...通过复制指定为构造函数参数的容器中的元素来构造和初始化队列(分别是mydeckmylist )。

如果要问为什么第二个参数指定第二个模板参数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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM