簡體   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