簡體   English   中英

std:sort vs insert into std :: set

[英]std:sort vs inserting into an std::set

我正在閱讀cin中的一些線段。 每個線段由起點和終點表示。 2D。 X和Y.

輸入未排序。 它是隨機順序的。 (更新:但是我需要它們首先按X排序然后按Y排序)

我可以讀取所有段,將它們存儲在向量中,然后調用std :: sort。 另一方面,我可以創建一個空的std :: set,並在它到達時插入每個段。 該集將自動維護排序順序。 這兩種方法中哪一種更有效?

更新:輸入的總大小(段數)是事先已知的。

你應該測量兩種方法的表現予以肯定,但它是一個安全的賭注,以假設std::sortstd::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.

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