Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::ranges::remove_copy,std::ranges::remove_copy_if,std::ranges::remove_copy_result,std::ranges::remove_copy_if_result

      From cppreference.com
      <cpp‎ |algorithm‎ |ranges
       
       
      Algorithm library
      Constrained algorithms and algorithms on ranges(C++20)
      Constrained algorithms, e.g.ranges::copy,ranges::sort, ...
      Execution policies(C++17)
      Sorting and related operations
      Partitioning operations
      Sorting operations
      Binary search operations
      (on partitioned ranges)
      Set operations (on sorted ranges)
      Merge operations (on sorted ranges)
      Heap operations
      Minimum/maximum operations
      (C++11)
      (C++17)
      Lexicographical comparison operations
      Permutation operations
      C library
      Numeric operations
      Operations on uninitialized memory
       
      Constrained algorithms
      All names in this menu belong to namespacestd::ranges
      Non-modifying sequence operations
      Modifying sequence operations
      Partitioning operations
      Sorting operations
      Binary search operations (on sorted ranges)
             
             
      Set operations (on sorted ranges)
      Heap operations
      Minimum/maximum operations
      Permutation operations
      Fold operations
      Operations on uninitialized storage
      Return types
       
      Defined in header<algorithm>
      Call signature
      (1)
      template<std::input_iterator I,std::sentinel_for<I> S,

               std::weakly_incrementable O,class T,class Proj=std::identity>
      requiresstd::indirectly_copyable<I, O>&&
               std::indirect_binary_predicate
                   <ranges::equal_to, std::projected<I, Proj>,const T*>
      constexpr remove_copy_result<I, O>

          remove_copy( I first, S last, O result,const T& value, Proj proj={});
      (since C++20)
      (until C++26)
      template<std::input_iterator I,std::sentinel_for<I> S,

               std::weakly_incrementable O,class Proj=std::identity,
               class T= std::projected_value_t<I, Proj>>
      requiresstd::indirectly_copyable<I, O>&&
               std::indirect_binary_predicate
                   <ranges::equal_to, std::projected<I, Proj>,const T*>
      constexpr remove_copy_result<I, O>

          remove_copy( I first, S last, O result,const T& value, Proj proj={});
      (since C++26)
      (2)
      template<ranges::input_range R,

               std::weakly_incrementable O,class T,class Proj=std::identity>
      requiresstd::indirectly_copyable<ranges::iterator_t<R>, O>&&
               std::indirect_binary_predicate
                   <ranges::equal_to,
                    std::projected<ranges::iterator_t<R>, Proj>,const T*>
      constexpr remove_copy_result<ranges::borrowed_iterator_t<R>, O>

          remove_copy( R&& r, O result,const T& value, Proj proj={});
      (since C++20)
      (until C++26)
      template<ranges::input_range R,

               std::weakly_incrementable O,class Proj=std::identity,
               class T= std::projected_value_t<ranges::iterator_t<R>, Proj>>
      requiresstd::indirectly_copyable<ranges::iterator_t<R>, O>&&
               std::indirect_binary_predicate
                   <ranges::equal_to,
                    std::projected<ranges::iterator_t<R>, Proj>,const T*>
      constexpr remove_copy_result<ranges::borrowed_iterator_t<R>, O>

          remove_copy( R&& r, O result,const T& value, Proj proj={});
      (since C++26)
      template<std::input_iterator I,std::sentinel_for<I> S,

               std::weakly_incrementable O,class Proj=std::identity,
               std::indirect_unary_predicate<std::projected<I, Proj>> Pred>
      requiresstd::indirectly_copyable<I, O>
      constexpr remove_copy_if_result<I, O>

          remove_copy_if( I first, S last, O result, Pred pred, Proj proj={});
      (3)(since C++20)
      template<ranges::input_range R,

               std::weakly_incrementable O,class Proj=std::identity,
               std::indirect_unary_predicate<
                    std::projected<ranges::iterator_t<R>, Proj>> Pred>
      requiresstd::indirectly_copyable<ranges::iterator_t<R>, O>
      constexpr remove_copy_if_result<ranges::borrowed_iterator_t<R>, O>

          remove_copy_if( R&& r, O result, Pred pred, Proj proj={});
      (4)(since C++20)
      Helper types
      template<class I,class O>
      using remove_copy_result=ranges::in_out_result<I, O>;
      (5)(since C++20)
      template<class I,class O>
      using remove_copy_if_result=ranges::in_out_result<I, O>;
      (6)(since C++20)

      Copies elements from the source range[firstlast), to the destination range beginning atresult, omitting the elements which (after being projected byproj) satisfy specific criteria. The behavior is undefined if the source and destination ranges overlap.

      1) Ignores all elements that are equal tovalue.
      3) Ignores all elements for which predicatepred returnstrue.
      2,4) Same as(1,3), but usesr as the source range, as if usingranges::begin(r) asfirst, andranges::end(r) aslast.

      The function-like entities described on this page arealgorithm function objects (informally known asniebloids), that is:

      Contents

      [edit]Parameters

      first, last - the iterator-sentinel pair defining the sourcerange of elements to process
      r - the source range of elements
      result - the beginning of the destination range
      value - the value of the elementsnot to copy
      comp - the binary predicate to compare the projected elements
      proj - the projection to apply to the elements

      [edit]Return value

      {last, result+ N}, whereN is the number of elements copied.

      [edit]Complexity

      Exactlyranges::distance(first, last) applications of the corresponding predicatecomp and any projectionproj.

      [edit]Notes

      The algorithm is stable, i.e. preserves the relative order of the copied elements.

      Feature-test macroValueStdFeature
      __cpp_lib_algorithm_default_value_type202403(C++26)List-initialization for algorithms(1,2)

      [edit]Possible implementation

      remove_copy (1,2)
      struct remove_copy_fn{template<std::input_iterator I,std::sentinel_for<I> S,std::weakly_incrementable O,class Proj=std::identity,class T= std::projected_value_t<I, Proj>>    requiresstd::indirectly_copyable<I, O>&&std::indirect_binary_predicate<ranges::equal_to,                                            std::projected<I, Proj>,const T*>constexpr ranges::remove_copy_result<I, O>        operator()(I first, S last, O result,const T& value, Proj proj={})const{for(;!(first== last);++first)if(value!=std::invoke(proj,*first)){*result=*first;++result;}return{std::move(first), std::move(result)};} template<ranges::input_range R,std::weakly_incrementable O,class Proj=std::identity,class T= std::projected_value_t<ranges::iterator_t<R>, Proj>>    requiresstd::indirectly_copyable<ranges::iterator_t<R>, O>&&std::indirect_binary_predicate<ranges::equal_to,             std::projected<ranges::iterator_t<R>, Proj>,const T*>constexpr ranges::remove_copy_result<ranges::borrowed_iterator_t<R>, O>        operator()(R&& r, O result,const T& value, Proj proj={})const{return(*this)(ranges::begin(r),ranges::end(r), std::move(result), value,                       std::move(proj));}}; inlineconstexpr remove_copy_fn remove_copy{};
      remove_copy_if (3,4)
      struct remove_copy_if_fn{template<std::input_iterator I,std::sentinel_for<I> S,std::weakly_incrementable O,class Proj=std::identity,std::indirect_unary_predicate<std::projected<I, Proj>> Pred>    requiresstd::indirectly_copyable<I, O>constexpr ranges::remove_copy_if_result<I, O>        operator()(I first, S last, O result, Pred pred, Proj proj={})const{for(; first!= last;++first)if(false==std::invoke(pred,std::invoke(proj,*first))){*result=*first;++result;}return{std::move(first), std::move(result)};} template<ranges::input_range R,std::weakly_incrementable O,class Proj=std::identity,std::indirect_unary_predicate<                 std::projected<ranges::iterator_t<R>, Proj>> Pred>    requiresstd::indirectly_copyable<ranges::iterator_t<R>, O>constexpr ranges::remove_copy_if_result<ranges::borrowed_iterator_t<R>, O>        operator()(R&& r, O result, Pred pred, Proj proj={})const{return(*this)(ranges::begin(r),ranges::end(r), std::move(result),                       std::move(pred), std::move(proj));}}; inlineconstexpr remove_copy_if_fn remove_copy_if{};

      [edit]Example

      Run this code
      #include <algorithm>#include <array>#include <complex>#include <iomanip>#include <iostream>#include <iterator>#include <string_view>#include <vector> void println(constauto rem,constauto& v){std::cout<< rem<<' ';for(constauto& e: v)std::cout<< e<<' ';std::cout<<'\n';} int main(){// Filter out the hash symbol from the given string.conststd::string_view str{"#Small #Buffer #Optimization"};std::cout<<"before: "<<std::quoted(str)<<'\n'; std::cout<<"after:\"";    std::ranges::remove_copy(str.begin(), str.end(),std::ostream_iterator<char>(std::cout),'#');std::cout<<"\"\n"; // Copy only the complex numbers with positive imaginary part.using Ci=std::complex<int>;constexprstd::array<Ci,5> source{        Ci{1,0}, Ci{0,1}, Ci{2,-1}, Ci{3,2}, Ci{4,-3}};std::vector<std::complex<int>> target;     std::ranges::remove_copy_if(        source,std::back_inserter(target),[](int imag){return imag<=0;},[](Ci z){return z.imag();});     println("source:", source);    println("target:", target); std::vector<std::complex<float>> nums{{2,2},{1,3},{4,8},{1,3}};std::vector<std::complex<double>> outs;#ifdef __cpp_lib_algorithm_default_value_typestd::remove_copy(nums.cbegin(), nums.cend(),std::back_inserter(outs),{1,3});// T gets deduced to std::complex<float>#elsestd::remove_copy(nums.cbegin(), nums.cend(),std::back_inserter(outs),std::complex<float>{1,3});#endif    println("nums:  ", nums);    println("outs:  ", outs);}

      Output:

      before: "#Small #Buffer #Optimization"after:  "Small Buffer Optimization"source: (1,0) (0,1) (2,-1) (3,2) (4,-3)target: (0,1) (3,2)nums:   (2,2) (1,3) (4,8) (1,3)outs:   (2,2) (4,8)

      [edit]See also

      removes elements satisfying specific criteria
      (algorithm function object)[edit]
      copies a range of elements to a new location
      (algorithm function object)[edit]
      copies a number of elements to a new location
      (algorithm function object)[edit]
      copies a range of elements in backwards order
      (algorithm function object)[edit]
      copies a range, replacing elements satisfying specific criteria with another value
      (algorithm function object)[edit]
      creates a copy of a range that is reversed
      (algorithm function object)[edit]
      copies and rotate a range of elements
      (algorithm function object)[edit]
      creates a copy of some range of elements that contains no consecutive duplicates
      (algorithm function object)[edit]
      copies a range of elements omitting those that satisfy specific criteria
      (function template)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/algorithm/ranges/remove_copy&oldid=180571"

      [8]ページ先頭

      ©2009-2025 Movatter.jp