std:: shift_left, std:: shift_right
| 
           Defined in header
            
            
             <algorithm>
            
            | ||
| 
           
            
             template
            
            
             <
            
            
             class
            
            ForwardIt
            
             >
            
             
             
              constexpr
             
             ForwardIt shift_left
             
              (
             
             ForwardIt first, ForwardIt last,
              | (1) | (since C++20) | 
| 
           
            
             template
            
            
             <
            
            
             class
            
            ExecutionPolicy,
            
             class
            
            ForwardIt
            
             >
            
             
             ForwardIt shift_left
             
              (
             
             ExecutionPolicy
             
              &&
             
             policy,
              | (2) | (since C++20) | 
| 
           
            
             template
            
            
             <
            
            
             class
            
            ForwardIt
            
             >
            
             
             
              constexpr
             
             ForwardIt shift_right
             
              (
             
             ForwardIt first, ForwardIt last,
              | (3) | (since C++20) | 
| 
           
            
             template
            
            
             <
            
            
             class
            
            ExecutionPolicy,
            
             class
            
            ForwardIt
            
             >
            
             
             ForwardIt shift_right
             
              (
             
             ExecutionPolicy
             
              &&
             
             policy,
              | (4) | (since C++20) | 
       Shifts the elements in the range
       
        
         [
        
        
         
          first
         
        
        
         ,
        
        
         
          last
         
        
        
         )
        
       
       by
       
        
         n
        
       
       positions.
      
- If n == 0 || n >= last - first , there are no effects.
- 
         Otherwise, for every integer
         
          
           i
          
         
         in
         
          [ 0 ,last - first - n), moves the element originally at position first + n + i to position first + i .
        i
       
       starting from
       
        
         
         
          0
         
         
        
       
       .
      - If n == 0 || n >= last - first , there are no effects.
- 
         Otherwise, for every integer
         
          
           i
          
         
         in
         
          [ 0 ,last - first - n), moves the element originally at position first + i to position first + n + i .
        ForwardIt
       
       meets the
       
        
         LegacyBidirectionalIterator
        
       
       requirements, then the moves are performed in decreasing order of
       
        
         i
        
       
       starting from
       
        
         last
         
          -
         
         first
         
          -
         
         n
         
          -
         
         
          1
         
        
       
       .
      Elements that are in the original range but not the new range are left in a valid but unspecified state.
If any of the following conditions is satisfied, the behavior is undefined:
- n >= 0 is not true .
- The type of * first is not MoveAssignable .
- 
        For
        shift_right,ForwardItis neither LegacyBidirectionalIterator nor ValueSwappable .
Parameters
| first | - | the beginning of the original range | 
| last | - | the end of the original range | 
| n | - | the number of positions to shift | 
| policy | - | the execution policy to use. See execution policy for details. | 
| Type requirements | ||
| - 
          ForwardIt
         must meet the requirements of
         
          
           LegacyForwardIterator
          
         
         . | ||
Return value
- If n is less than std:: distance ( first, last ) , returns an iterator equal to std:: next ( first, ( std:: distance ( first, last ) - n ) ) .
- Otherwise, returns first .
- If n is less than std:: distance ( first, last ) , returns an iterator equal to std:: next ( first, n ) .
- Otherwise, returns last .
Complexity
Exceptions
       The overloads with a template parameter named
       
        ExecutionPolicy
       
       report errors as follows:
      
- 
        If execution of a function invoked as part of the algorithm throws an exception and
        ExecutionPolicyis one of the standard policies , std::terminate is called. For any otherExecutionPolicy, the behavior is implementation-defined.
- If the algorithm fails to allocate memory, std::bad_alloc is thrown.
Notes
| Feature-test macro | Value | Std | Feature | 
|---|---|---|---|
| 
           __cpp_lib_shift
           | 201806L | (C++20) | 
           std::shift_left
          and
           std::shift_right
           | 
Example
#include <algorithm> #include <iostream> #include <string> #include <type_traits> #include <vector> struct S { int value{0}; bool specified_state{true}; S(int v = 0) : value{v} {} S(S const& rhs) = default; S(S&& rhs) { *this = std::move(rhs); } S& operator=(S const& rhs) = default; S& operator=(S&& rhs) { if (this != &rhs) { value = rhs.value; specified_state = rhs.specified_state; rhs.specified_state = false; } return *this; } }; template<typename T> std::ostream& operator<<(std::ostream& os, std::vector<T> const& v) { for (const auto& s : v) { if constexpr (std::is_same_v<T, S>) s.specified_state ? os << s.value << ' ' : os << ". "; else if constexpr (std::is_same_v<T, std::string>) os << (s.empty() ? "." : s) << ' '; else os << s << ' '; } return os; } int main() { std::cout << std::left; std::vector<S> a{1, 2, 3, 4, 5, 6, 7}; std::vector<int> b{1, 2, 3, 4, 5, 6, 7}; std::vector<std::string> c{"α", "β", "γ", "δ", "ε", "ζ", "η"}; std::cout << "vector<S> \tvector<int> \tvector<string>\n"; std::cout << a << " " << b << " " << c << '\n'; std::shift_left(begin(a), end(a), 3); std::shift_left(begin(b), end(b), 3); std::shift_left(begin(c), end(c), 3); std::cout << a << " " << b << " " << c << '\n'; std::shift_right(begin(a), end(a), 2); std::shift_right(begin(b), end(b), 2); std::shift_right(begin(c), end(c), 2); std::cout << a << " " << b << " " << c << '\n'; std::shift_left(begin(a), end(a), 8); // has no effect: n >= last - first std::shift_left(begin(b), end(b), 8); // ditto std::shift_left(begin(c), end(c), 8); // ditto std::cout << a << " " << b << " " << c << '\n'; // std::shift_left(begin(a), end(a), -3); // UB, e.g. segfault }
Possible output:
vector<S> vector<int> vector<string> 1 2 3 4 5 6 7 1 2 3 4 5 6 7 α β γ δ ε ζ η 4 5 6 7 . . . 4 5 6 7 5 6 7 δ ε ζ η . . . . . 4 5 6 7 . 4 5 4 5 6 7 5 . . δ ε ζ η . . . 4 5 6 7 . 4 5 4 5 6 7 5 . . δ ε ζ η .
See also
| 
           
            
             
              (C++11)
             
            
           
           | moves a range of elements to a new location (function template) | 
| 
           
            
             
              (C++11)
             
            
           
           | moves a range of elements to a new location in backwards order (function template) | 
| rotates the order of elements in a range (function template) | |
| shifts elements in a range (algorithm function object) |