C++ boost::algorithm::partition_copy()














































C++ boost::algorithm::partition_copy()



Description:
The header 'boost/algorithm/cxx11/partition_copy.hpp'   contains the algorithm partition_copy() in C++ boost library. This function copies the elements from the range [first, last) to two different sequence depending on the value returned by the predicate. If the predicate returns 'True' the element is copied to the range beginning at out_true and rest of the elements are copied to the out_false.
 
Syntax:
template<typename InputIterator, typename OutputIterator1, typename OutputIterator2, typename UnaryPredicate>
     
BOOST_CXX14_CONSTEXPR std::pair< OutputIterator1, OutputIterator2 >
     
partition_copy(InputIterator, InputIterator, OutputIterator1, OutputIterator2, UnaryPredicate);

template<typename Range, typename OutputIterator1, typename OutputIterator2, typename UnaryPredicate>
     
BOOST_CXX14_CONSTEXPR std::pair< OutputIterator1, OutputIterator2 >
     
partition_copy(const Range &, OutputIterator1, OutputIterator2, UnaryPredicate);

Parameters:
The following parameters are accepted by the function:
1.) first: It specifies the initial position of the sequence by input iterator (first is inclusive in range).
2.) last: It specifies the end position of the sequence by input iterator (last is exclusive in range).
3.) out_true: It specifies the beginning of the output range for the elements that satisfy the predicate
4.) out_false: It specifies the beginning of the output range for the elements that don't satisfy the predicate

3.) UnaryPredicate: It is a unary function that accepts the elements of the sequence in the range provided in argument and returns true or false based on some condition.

The function returns a std::pair constructed from the iterator to the end of the out_true range and the iterator to the end of the out_false range.


Program:
#include <boost/algorithm/cxx11/partition_copy.hpp>
#include <vector>
#include <iostream>
using namespace std;

int main()
{
   
vector<int> Arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, Arr_True, Arr_False;
   
/* Predicate to check even elements in sequence */
   
auto predicate = [](int element) { return element % 2 == 0; };
   
/* Predicate which determine if the element will be stored in Arr_True or Arr_False
    ** back_inserter generates iterator for inserting element at the end of array
    */

    boost::algorithm::partition_copy(Arr.begin(), Arr.end(), back_inserter(Arr_True), back_inserter(Arr_False), predicate);
   
cout << "Even elements are: ";
   
for(auto i : Arr_True)
       
cout << i << " ";
   
cout << endl << "Odd elements are: ";
   
for(auto i : Arr_False)
       
cout << i << " ";
}


Example:
Output: Even elements are: 2 4 6 8 10
Odd elements are: 1 3 5 7 9


Complexity:
Time Complexity: The time complexity is linear between first and last element of the sequence. Predicate is called for the same number of time.

Please write on comment section if you find any mistake or for any suggestions.

More Articles of Abhishek Kumar Singh:

Name Views Likes
C++ boost::range::replace_if 956 0
C++ boost::range::copy_backward 724 1
C++ boost::range::max_element 1177 0
C++ boost::range::inplace_merge 647 0
C++ boost::range::copy 1250 1
C++ boost::algorithm::is_partitioned() 819 1
C++ boost::algorithm::copy_if() 967 0
C++ boost::range::for_each (version 2) 727 0
C++ boost::range::set_symmetric_difference 636 0
C++ boost::remove_copy_if 723 0
C++ boost::range::set_intersection 940 0
C++ boost::range::find_end 673 0
C++ boost::range::remove_erase_if 1480 0
C++ boost::range::push_back 1086 0
C++ boost::range::generate 624 0
C++ boost::algorithm::any_of() 625 0
C++ boost::range::insert 696 0
C++ boost::range::remove_erase 896 0
C++ boost::range::reverse 1165 0
C++ boost::algorithm::equal() 724 1
C++ boost::range::copy_n 804 0
C++ boost::range::random_shuffle 1218 1
C++ boost::algorithm::partition_point() 586 0
C++ boost::algorithm::one_of_equal() 508 0
C++ boost::algorithm::all_of() 857 1
C++ boost::range::merge 962 0
C++ boost::range::reverse_copy 733 0
C++ boost::range::find 716 0
C++ boost::range::fill_n 586 0
Removing duplicate elements from std::vector (using std::unique and std::set) 2125 1
C++ boost::range::equal 671 0
C++ boost::algorithm::iota() 904 0
C++ boost::range::is_sorted 819 0
test article 760 2
C++ boost::algorithm::is_permutation() 808 1
C++ boost::partial_sum 831 0
C++ boost::range::partial_sort 893 1
C++ boost::range::min_element 989 0
C++ boost::range::iota 990 0
C++ boost::range::set_union 687 0
C++ boost::algorithm::partition_copy() 1047 3
C++ boost::range::swap_ranges 592 0
C++ boost::range::for_each 857 0
C++ boost::range::upper_bound 1021 0
C++ boost::range::binary_search 1187 0
C++ boost::algorithm::all_of_equal() 528 0
C++ boost::algorithm::copy_n() 647 1
C++ boost::range::lower_bound 985 0
C++ boost::algorithm::gather() 1388 0
C++ boost::algorithm::none_of_equal() 570 0
C++ boost::algorithm::one_of() 688 2
C++ boost::range::rotate 817 0
C++ boost::algorithm::any_of_equal() 817 0
Use of Comparator in C++ 2045 0
C++ boost::range::count 785 0
C++ boost::range::replace_copy_if 610 0
C++ boost::range::remove 789 2
C++ boost::remove_if 1360 1
C++ boost::range::nth_element 1095 1
C++ boost::range::partition 715 1
C++ boost::range::erase 607 0
C++ boost::range::fill 873 1
C++ boost::range::find_if 1214 0
C++ boost::range::lexicographical_compare 781 0
C++ boost::algorithm::none_of() 559 0
C++ boost::algorithm::hex() 3330 0
C++ boost::range::replace 702 0
C++ boost::range::replace_copy 794 1
C++ boost::range::set_difference 903 0
C++ boost::range::overwrite 680 0
C++ boost::range::count_if 908 0
C++ boost::range::push_front 641 0
C++ boost::range::includes 638 0
C++ boost::algorithm::is_sorted() 667 0
C++ boost::range::remove_copy 595 1
C++ boost::algorithm::minmax_element 596 1
Deletion of leaf node of a Binary Search Tree 1653 1
Nth Fibonacci Number (Recursive Solution, Dynamic Programming, Iterative Solution 3767 1
C++ boost::range::rotate_copy 621 0

Comments