將元素添加到 astd::vector<int> v最好這樣做:
// Read and manipulate a, b, c triplet as ints.
// Potentially also: v.reserve(v.size() 3); or trust vector growth policy?
v.push_back(a);
v.push_back(b);
v.push_back(c);
或者
v.insert(v.end(), {a, b, c});
從性能的角度來看(假設我們總是要插入每次都不同的三元組和大量不固定數量的三元組,比如 100 萬個三元組)?謝謝你的提示。
uj5u.com熱心網友回復:
首先,v.reserve(v.size() 3);在回圈中進行通常是一個非常糟糕的主意,因為它肯定會導致每次迭代都進行新的重新分配。例如,帶有 libstdc 和 libc 的 Clang 和 GCC 實際上執行線性數量的重新分配(參見此處、此處甚至此處)。這是來自cppreference的參考:
正確使用reserve() 可以防止不必要的重新分配,但不恰當地使用reserve()(例如,在每次push_back() 呼叫之前呼叫它)實際上可能會增加重新分配的次數(通過導致容量線性增長而不是指數增長)和導致計算復雜度增加和性能下降。例如,通過參考接收任意向量并向其附加元素的函式通常不應在該向量上呼叫 Reserve(),因為它不知道該向量的使用特征。
當插入一個范圍時,insert()的范圍版本通常是更可取的,因為它保留了正確的容量增長行為,不像 Reserve() 后跟一系列 push_back()s。
預訂()不能用于減少容器的容量;為此提供了shrink_to_fit()。
當涉及到insertVS 時push_back,insert應該比 many 稍微好一點,push_back因為容量檢查只能進行一次,而不是多次push_back。話雖如此,性能差異非常依賴于標準庫的實作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/377311.html
上一篇:提高讀取字串的函式速度
下一篇:在java中,為什么它很慢?
