STL move移動演算法

2021-09-05 09:56:04 字數 1229 閱讀 9101

move() 演算法會將它的前兩個輸入迭代器引數指定的序列移到第三個引數定義的目的序列的開始位置,第三個引數必須是輸出迭代器。這個演算法返回的迭代器指向最後乙個被移動到目的序列的元素的下乙個位置。

這是乙個移動操作,因此無法保證在進行這個操作之後,輸入序列仍然保持不變;源元素仍然會存在,但它們的值可能不再相同了,因此在移動之後,就不應該再使用它們。如果源序列可以被替換或破壞,就可以選擇使用 move() 演算法。如果不想擾亂源序列,可以使用 copy() 演算法。下面是乙個展示如何使用它的示例:

std::vectordata ;

std::move(std::begin(data) + 2, std::end(data), std::begin(data));

data.erase(std::end(data) - 2, std::end(data)); // erase moved elements

std::copy(std::begin (data), std::end(data), std::ostream_iterator);

std::cout << std::endl;

// 3, 4, 5, 6, 7, 8

這裡會將 data 的最後 6 個元素移到容器的開頭。它能夠正常工作是因為目的位址在源序列之外。在移動之後,無法保證最後兩個元素的值。這裡它們雖然被移除了,但同樣可以將它們重置為已知的值一一例如 0。

最後一行中的注釋展示了輸出結果。當然也可以用 rotate() 演算法來代替 move() 移動元素,在這種情況下,我們肯定知道最後兩個元素的值。

如果乙個移動操作的目的位址位於源序列之內,move() 就無法正常工作,這意味著移動需要從序列的右邊開始。原因是一些元素在移動之前會被重寫,但 move_backward() 可以正常工作。它的前兩個引數指定了被移動的序列,第三個引數是目的位址的結束迭代器。例如:

std::vectordata ;

std::move(std::begin(data), std::end(data), std::begin(data) + 2);

data.erase(std::begin(data), std::begin(data) + 2); // erase moved elements

std::copy(std::begin (data), std::end(data), std::ostream_iterator);

std::cout << std::endl;

移動平均演算法

移動平均演算法說明 進行成本計算時,系統自動按照單據業務發生的先後順序進行出庫成本計算,對於入庫業務,系統自動計算結存金額 結存單價,結存數量,結存數量 上一筆結存數量 本次入庫數量 結存金額 上一筆結存金額 本次入庫金額,結存單價 結存金額 結存數量,對於出庫業務,系統自動取當前的結存單價作為出庫...

陣列移動演算法

ash前段時間貼出了乙個問題 對於有k個元素的陣列 int a k 寫乙個高效演算法將陣列內容迴圈左移m位 比如 int a 6 迴圈左移3位得到結果,要求 1不允許另外申請陣列空間,但可以申請少許變數 2不允許採用每次左移 這是乙個有趣的問題,當時ash給出了乙個很簡單的解法 1 將整個陣列倒排 ...

STL的移動演算法

要在自定義型別中使用移動演算法,需要在元素中提供移動賦值運算子,移動賦值運算子和std move 詳見 c 高階程式設計 第9章 class mystring mystring const string str mstr str mystring operator mystring rhs 移動賦值...