GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
std::shift_left,std::shift_right(3) C++ Standard Libary std::shift_left,std::shift_right(3)

std::shift_left,std::shift_right - 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)


typename std::iterator_traits<ForwardIt>::difference_type n );
template< class ExecutionPolicy, class ForwardIt >


ForwardIt shift_left( ExecutionPolicy&& policy, ForwardIt first, (2) (since C++20)
ForwardIt last,


typename std::iterator_traits<ForwardIt>::difference_type n );
template< class ForwardIt >


constexpr ForwardIt shift_right( ForwardIt first, ForwardIt last, (3) (since C++20)


typename std::iterator_traits<ForwardIt>::difference_type n );
template< class ExecutionPolicy, class ForwardIt >


ForwardIt shift_right( ExecutionPolicy&& policy, ForwardIt first, (4) (since C++20)
ForwardIt last,


typename std::iterator_traits<ForwardIt>::difference_type n );


Shifts the elements in the range [first, last) by n positions.


1) Shifts the elements towards the beginning of the range. If n == 0 || n >= last -
first, there are no effects. If n < 0, the behavior is undefined. Otherwise, for
every integer i in [0, last - first - n), moves the element originally at position
first + n + i to position first + i. The moves are performed in increasing order of
i starting from 0.
3) Shifts the elements towards the end of the range. If n == 0 || n >= last - first,
there are no effects. If n < 0, the behavior is undefined. Otherwise, for every
integer i in [0, last - first - n), moves the element originally at position first +
i to position first + n + i. If ForwardIt meets the LegacyBidirectionalIterator
requirements, then the moves are performed in decreasing order of i starting from
last - first - n - 1.
2,4) Same as (1) and (3), respectively, but executed according to policy and the
moves may be performed in any order. This overload participates in overload
resolution only if std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>
is true


Elements that are in the original range but not the new range are left in a valid
but unspecified state.


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.


-
ForwardIt must meet the requirements of LegacyForwardIterator.
-
ForwardIt must meet either the requirements of LegacyBidirectionalIterator or the
requirements of ValueSwappable for overloads (3-4).
-
The type of dereferenced ForwardIt must meet the requirements of MoveAssignable.


1-2) The end of the resulting range. If n is less than last - first, returns first +
(last - first - n). Otherwise, returns first.
3-4) The beginning of the resulting range. If n is less than last - first, returns
first + n. Otherwise, returns last.


1-2) At most std::distance(first, last) - n assignments.
3-4) At most std::distance(first, last) - n assignment or swaps.


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 ExecutionPolicy is one of the standard policies, std::terminate is called.
For any other ExecutionPolicy, the behavior is implementation-defined.
* If the algorithm fails to allocate memory, std::bad_alloc is thrown.


Feature-test macro: __cpp_lib_shift

// Run this code


#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.)
}


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 . . δ ε ζ η .


move moves a range of elements to a new location
(C++11) (function template)
move_backward moves a range of elements to a new location in backwards order
(C++11) (function template)
rotate rotates the order of elements in a range
(function template)
ranges::shift_left shifts elements in a range
ranges::shift_right (niebloid)
(C++23)

2022.07.31 http://cppreference.com

Search for    or go to Top of page |  Section 3 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.