建立向量副本
將向量附加到自身時,出於效能原因,最好避免使用循環。 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 而不是調整大小:
auto old_count = xx.size(); xx.reserve(2 * old_count); std::copy_n(xx.begin(), old_count, std::back_inserter(xx));
使用Reserve 時,copy_n 是必需的,因為end() 迭代器指向末尾之外,使其對於插入無效。
這種方法滿足23.3.6.5 [vector.modifiers]中概述的條件,確保插入點之前的迭代器和引用保持有效,並且如果可能的話不會發生重新分配。
以上是如何在沒有循環的情況下在 C 中有效地複製向量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!