C++ partition_copy(STL partition_copy)演算法使用詳解

2020-07-16 10:04:29
partition_copy() 演算法以和 stable_partition() 相同的方式對序列進行分割區,但那些使謂詞返回 true 的元素會被複製到一個單獨的序列中,使謂詞返回 false 的那些元素會被複製到第三個序列中。這個操作不會改變原始序列。

原始序列由前兩個引數指定,它們必須是輸入疊代器。第 3 個引數用來確定目的序列的開始位置,它會儲存那些使謂詞返回 true 的元素。第 4 個引數用來確定另一個目的序列的開始位置,它會儲存那些使謂詞返回 false 的元素。第 5 個引數是用來分割區元素的謂詞。下面是一個展示 partition_copy() 用法的完整程式:
// Using partition_copy() to find values above average and below average
#include <iostream>                              // For standard streams
#include <vector>                                // For vector container
#include <algorithm>                             // For partition_copy(), copy()
#include <numeric>                               // For accumulate()
#include <iterator>                              // For back_inserter, ostream_iterator

int main()
{
    std::vector<double> temperatures {65, 75, 56, 48, 31, 28, 32, 29, 40, 41, 44, 50};
    std::vector<double> low_t;                       // Stores below average temperatures
    std::vector<double> high_t;                      // Stores average or above temperatures

    auto average = std::accumulate(std::begin(temperatures), std::end(temperatures), 0.0) / temperatures.size();
    std::partition_copy(std::begin(temperatures), std::end(temperatures), std::back_inserter(low_t), std::back_inserter(high_t),[average](double t) { return t < average; });

    // Output below average temperatures
    std::copy(std::begin(low_t), std::end(low_t), std::ostream_iterator<double>{std::cout, " "});
    std::cout << std::endl;

    // Output average or above temperatures
    std::copy(std::begin(high_t), std::end(high_t), std::ostream_iterator<double>{std::cout, " "});
    std::cout << std::endl;
}
這段程式碼所做的事情和先前介紹的 stable_partition() 相同,但小於平均值的元素會被複製到 low_t 容器中,大於等於平均值的元素會被複製到 high_t 容器中。輸出語句可以對此進行驗證,它們產生的輸出如下:

31 28 32 29 40 41 44
65 75 56 48 50

注意,main() 中的這段程式碼使用輔助函數 back_inserter() 建立的 back_insert_iterator 物件作為 partition_copy() 呼叫中兩個目的容器的疊代器。back_insert_iterator 通過呼叫 push_back() 向容器中新增新元素,使用這種方式可以不需要提前知道容器中儲存了多少元素。如果對目的序列使用開始疊代器,在執行這個操作前,為了可以複製盡可能多的元素,目的序列中必須有足夠的元素。

注意,如果輸入序列和輸出序列重疊,這個演算法將無法正常工作。