namespace std {
template <class InputIterator,
class OutputIterator1,
class OutputIterator2,
class Predicate>
pair<OutputIterator1, OutputIterator2>
partition_copy(InputIterator first,
InputIterator last,
OutputIterator1 out_true,
OutputIterator2 out_false,
Predicate pred); // (1) C++11
template <class InputIterator,
class OutputIterator1,
class OutputIterator2,
class Predicate>
constexpr pair<OutputIterator1, OutputIterator2>
partition_copy(InputIterator first,
InputIterator last,
OutputIterator1 out_true,
OutputIterator2 out_false,
Predicate pred); // (1) C++20
template <class ExecutionPolicy,
class ForwardIterator,
class ForwardIterator1,
class ForwardIterator2,
class Predicate>
pair<ForwardIterator1, ForwardIterator2>
partition_copy(ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
ForwardIterator1 out_true,
ForwardIterator2 out_false,
Predicate pred); // (2) C++17
}
概要
イテレータ範囲[first, last)を条件を満たすか満たさないかで、2つの出力範囲へ分けてコピーする。
この関数は、入力のイテレータ範囲のうち、条件を満たす要素を出力イテレータ範囲out_true、条件を満たさない要素を出力イテレータ範囲out_falseにコピーする。
テンプレートパラメータ制約
InputIteratorの value type はAssignableで、out_trueとout_falseのOutputIteratorへ書き込み可能で、Predicateの引数型へ変換可能であること
事前条件
- 入力範囲は出力範囲のどちらとも重なっていてはならない
効果
イテレータ範囲[first,last) 内にあるそれぞれのイテレータ i について、pred(*i) が true なら *i を out_true へコピーし、そうでない場合は out_false へコピーする。
戻り値
first には out_true の終端が、second には out_false の終端が格納されたpairオブジェクトを返す。
計算量
正確に last - first 回述語が適用される。
例
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <string>
void print(const std::string& name, const std::vector<int>& v)
{
std::cout << name << " : ";
std::for_each(v.begin(), v.end(), [](int x) {
std::cout << x << ",";
});
std::cout << std::endl;
}
bool is_even(int x) { return x % 2 == 0; }
int main()
{
std::vector<int> v = {1, 2, 3, 4, 5};
// 偶数グループと奇数グループに分ける
std::vector<int> evens;
std::vector<int> odds;
std::partition_copy(v.begin(), v.end(),
std::back_inserter(evens),
std::back_inserter(odds),
is_even);
print("v", v);
print("evens", evens);
print("odds", odds);
}
出力
v : 1,2,3,4,5,
evens : 2,4,
odds : 1,3,5,
バージョン
言語
- C++11
処理系
- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅, 2015 ✅