![](/img/trans.png)
[英]Elements' contiguous storage locations in std::vector and std::deque
[英]is it possible for set to have std::vector as underlying storage for storage of its elements?
對於小型集合,無論應用於什么操作,std :: vector幾乎可以肯定是最好的容器。 是否有可能將std :: vector作為元素集容器的基礎存儲,而不是包含大量堆分配(也許boost有什么用)的紅黑樹?還是我必須自己發明它?
由於性能原因,不能選擇普通的std :: vector和std :: sort,並且std :: inplace_merge容易出現編碼錯誤(迭代器無效等)。
編輯 :澄清了問題
無法指定STL集的基礎結構。 充其量,您可以編寫一個使用向量的分配器,以提供set使用的內存,該內存可能不是您想要的。
我認為您正在尋找boost :: container :: flat_set
flat_set與std :: set類似,但它的實現類似於有序向量。
如果你的意思是你可以
std::set<std::vector<MyType> > myIdealContainer;
那么答案是肯定的,只要您能夠有意義地將向量包裝在使它可排序的內容中(這樣set就可以對其成員進行排序)。 但是請注意復制效率低下。
如果您是說我可以使用vector實例化set作為自定義分配器的存儲,那么我不知道您將如何做(或為什么要這么做)。
如果您是說可以像對待集合一樣對待向量,那么答案是否定的。 如果您的數據集很小並且與容器成員匹配很便宜,請使用向量,保留插入的順序,並使用std :: find線性掃描匹配項。 如果數據集很大和/或匹配成本很高,請使用set。
對於小尺寸,所有容器都非常有效; 除非知道性能有問題,否則只使用set
在你的情況下
使用向量交易功能(排序,唯一性)來存儲大小
使用set做相反的事情
如果您需要排序和唯一性,那么請選擇具有該功能的容器,除非您確定它的交易不好
不,無法指定要用於std::set
容器,只能使用容器適配器(例如std::queue
或std::stack
來做到這一點。 std::set
是具有自身性能要求的基本容器之一。 std::vector
可能不是所有情況下的最佳容器。 例如,要獲得良好的查找性能,可以選擇set,因為find
為O(log n)
,其中vector為O(n)
也許我誤會了您,但是如果您嘗試使用具有std :: vector的std :: set進行數據存儲(因此該集合的所有數據實際上都存儲在vector中),那么答案應該是“否”。
原因很簡單,因為c ++ std :: set實現是一個二進制搜索樹,而std :: vector只管理一個簡單的數組/內存塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.