[英]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.