最終更新日時:
が更新

履歴 編集

function template
<algorithm>

std::partition_copy(C++11)

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);
}

概要

与えられた範囲を条件によって 2 つの出力の範囲へ分けてコピーする。

要件

  • InputIterator の value type は Assignable で、out_trueout_falseOutputIterator へ書き込み可能で、Predicate の argument type へ変換可能でなければならない。
  • 入力範囲は出力範囲のどちらとも重なっていてはならない。

効果

[first,last) 内にあるそれぞれのイテレータ i について、pred(*i)true なら *iout_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

処理系

参照