首頁  >  文章  >  後端開發  >  如何在沒有循環的情況下在 C 中有效地複製向量?

如何在沒有循環的情況下在 C 中有效地複製向量?

Barbara Streisand
Barbara Streisand原創
2024-11-08 16:47:01157瀏覽

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 而不是調整大小:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn