簡體   English   中英

set是否有可能將std :: vector作為其元素存儲的基礎存儲?

[英]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::queuestd::stack來做到這一點。 std::set是具有自身性能要求的基本容器之一。 std::vector可能不是所有情況下的最佳容器。 例如,要獲得良好的查找性能,可以選擇set,因為findO(log n) ,其中vector為O(n)

也許我誤會了您,但是如果您嘗試使用具有std :: vector的std :: set進行數據存儲(因此該集合的所有數據實際上都存儲在vector中),那么答案應該是“否”。
原因很簡單,因為c ++ std :: set實現是一個二進制搜索樹,而std :: vector只管理一個簡單的數組/內存塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM