STL partition_copy分割演算法
阿新 • • 發佈:2018-12-12
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() 向容器中新增新元素,使用這種方式可以不需要提前知道容器中儲存了多少元素。如果對目的序列使用開始迭代器,在執行這個操作前,為了可以複製儘可能多的元素,目的序列中必須有足夠的元素。
注意,如果輸入序列和輸出序列重疊,這個演算法將無法正常工作。