[英]optimized Notaion of lower bound in c++?
auto it = v.lower_bound(val);
auto it=lower_bound(v.begin(),v.end(),val);
問題:有時當我們使用上面給出的第一個符號時效果更佳,而第二個符號給出超過時間限制...為什么????
一個常見的誤解是這兩個函數是以相同的方式實現的。
C++ 標准對此有明確規定 - 對於非LegacyRandomAccessIterators ,比較次數是線性的! std::set
屬於這一類,但會有專門針對它的lower_bound
的更優化版本。
一個好的經驗法則:總是使用 case v.lower_bound(val);
如果你可以的話。
在 C++ 標准庫中,許多算法作為免費函數提供。 但有時,容器可能有同名的方法。 在這種情況下,成員變體確實是優化變體。 但這有一個警告:它針對該容器進行了優化。
一個例子是std::sort
與std::list::sort
。 您甚至不能使用std::sort
對列表進行排序,因為它太慢了。 “最優化”的選擇是std::sort
和std::vector
。 std::vector::sort
不需要特殊優化; 免費的 function 已經足夠快了。
lower_bound
類似; 它也作為免費的 function 和一些容器的方法存在。 當你的容器是固定的,並且那個容器有一個lower_bound
方法時,使用它。 但是如果你可以選擇你的容器,你需要考慮你需要在那個容器上的所有操作。
“Time Limit Exceeded”建議競爭性編程,您需要了解 big-O 復雜性。 C++ 記錄了幾乎所有標准庫函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.