[英]std:sort vs inserting into an std::set
我正在閱讀cin中的一些線段。 每個線段由起點和終點表示。 2D。 X和Y.
輸入未排序。 它是隨機順序的。 (更新:但是我需要它們首先按X排序然后按Y排序)
我可以讀取所有段,將它們存儲在向量中,然后調用std :: sort。 另一方面,我可以創建一個空的std :: set,並在它到達時插入每個段。 該集將自動維護排序順序。 這兩種方法中哪一種更有效?
更新:輸入的總大小(段數)是事先已知的。
你應該測量兩種方法的表現予以肯定,但它是一個安全的賭注,以假設std::sort
上std::vector
比插入的方式更快std::set
由於當地的影響和大常量隱藏在樹插入算法中。 此外,后續查找和迭代將更快。
(但是, std::set
更適合支持混合系列的插入和刪除/查找/迭代。維護向量中的順序很昂貴,因為每次插入平均需要線性時間。)
作為一個好的經驗法則,提供更嚴格的保證,您將獲得更差的性能。
插入std::set
確保在每次插入后對序列進行排序。
插入到std::vector
,並在完成所有插入后調用std::sort
,確保在對vector
進行了所有操作后對序列進行排序。 它不需要在所有中間插入期間對矢量進行排序。
std::vector
也表現出更好的空間局部性,並且需要更少的內存分配。 所以,我將承擔vector
的方法要快一些,但是如果性能問題你,那么它的問題被測量足夠。
如果你不在乎什么來衡量你的情況與您的代碼在您的應用程序更快的數據集,那么你不在乎這是更快。
根據需要使用具有適當語義的容器。 效率通常從該選擇中自動進行。
如果您遇到性能瓶頸,請進行一些基准測試。
它確實依賴,但確定std::set
用於隨機插入和刪除。 在這種情況下,您只是插入。 使用std::vector
。 另外,也許更重要的是,如果你事先知道有多少段,你只需要分配一次向量,它不會在每次大小翻倍時重新分配內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.