」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在 C++ 中高效複製向量而不使用循環?

如何在 C++ 中高效複製向量而不使用循環?

發佈於2024-12-22
瀏覽:356

How to Efficiently Duplicate a Vector in C   Without Loops?

創建向量副本

將向量附加到自身時,出於性能原因,最好避免使用循環。 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