創建向量副本
將向量附加到自身時,出於性能原因,最好避免使用循環。 std::vector::insert 函數雖然是一個選項,但不允許使用迭代器*this.
用std::copy
使用std: :copy 來解決這個問題似乎是一個解決方案,但這種方法可能會導致分段錯誤。
最優解決方案
最佳解決方案是同時使用resize(或reserve)和copy_n。它的運作方式如下:
auto old_count = xx.size(); xx.resize(2 * old_count); std::copy_n(xx.begin(), old_count, xx.begin() old_count);
這段程式碼首先將原始向量大小儲存在old_count。然後它調整 xx 的大小以使其容量加倍。最後,std::copy_n 將元素從 xx 的開頭複製到 xx 的結尾,從而有效地複製向量。
或者,您可以使用 Reserve 而不是 resize:
auto old_count = xx.size(); xx.reserve(2 * old_count); std::copy_n(xx.begin(), old_count, std::back_inserter(xx));
使用保留時,copy_n 是必要的,因為end() 迭代器指向末尾之外,使其無效inserts.
此方法滿足23.3.6.5 [vector.modifiers]中概述的條件,確保插入點之前的迭代器和引用保持有效,並且如果可能的話不會發生重新分配。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3