Namespaces
Variants

std:: shift_left, std:: shift_right

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
shift_left shift_right
(C++20) (C++20)
Sampling operations
(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
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Definiert in Header <algorithm>
template < class ForwardIt >

constexpr ForwardIt shift_left ( ForwardIt first, ForwardIt last,
typename std:: iterator_traits < ForwardIt > ::

difference_type n ) ;
(1) (seit C++20)
template < class ExecutionPolicy, class ForwardIt >

ForwardIt shift_left ( ExecutionPolicy && policy,
ForwardIt first, ForwardIt last,
typename std:: iterator_traits < ForwardIt > ::

difference_type n ) ;
(2) (seit C++20)
template < class ForwardIt >

constexpr ForwardIt shift_right ( ForwardIt first, ForwardIt last,
typename std:: iterator_traits < ForwardIt > ::

difference_type n ) ;
(3) (seit C++20)
template < class ExecutionPolicy, class ForwardIt >

ForwardIt shift_right ( ExecutionPolicy && policy,
ForwardIt first, ForwardIt last,
typename std:: iterator_traits < ForwardIt > ::

difference_type n ) ;
(4) (seit C++20)

Verschiebt die Elemente im Bereich [ first , last ) um n Positionen.

1) Verschiebt die Elemente in Richtung des Anfangs des Bereichs.
  • Wenn n == 0 || n >= last - first , gibt es keine Auswirkungen.
  • Andernfalls wird für jede ganze Zahl i in [ 0 , last - first - n ) das Element, das ursprünglich an Position first + n + i stand, an Position first + i verschoben.
Die Züge werden in aufsteigender Reihenfolge von i beginnend bei 0 durchgeführt.
3) Verschiebt die Elemente in Richtung des Endes des Bereichs.
  • Wenn n == 0 || n >= last - first , gibt es keine Effekte.
  • Andernfalls wird für jede ganze Zahl i in [ 0 , last - first - n ) das Element, das ursprünglich an Position first + i stand, an Position first + n + i verschoben.
Falls ForwardIt die LegacyBidirectionalIterator Anforderungen erfüllt, dann werden die Verschiebungen in absteigender Reihenfolge von i beginnend bei last - first - n - 1 durchgeführt.
2,4) Gleich wie (1) und (3) , jeweils, aber ausgeführt gemäß policy und die Verschiebungen können in beliebiger Reihenfolge durchgeführt werden.
Diese Überladungen nehmen nur dann an der Überladungsauflösung teil, wenn std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> true ist.

Elemente, die sich im ursprünglichen Bereich befinden, aber nicht im neuen Bereich, verbleiben in einem gültigen, aber nicht spezifizierten Zustand.

Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert:

Inhaltsverzeichnis

Parameter

first, last - das Paar von Iteratoren, das den Bereich der zu verschiebenden Elemente definiert
n - die Anzahl der Positionen, um die verschoben werden soll
policy - die zu verwendende Ausführungsrichtlinie
Typanforderungen
-
ForwardIt muss die Anforderungen von LegacyForwardIterator erfüllen.

Rückgabewert

1,2) Das Ende des resultierenden Bereichs.
3,4) Der Anfang des resultierenden Bereichs.
  • Wenn n kleiner ist als std:: distance ( first, last ) , wird ein Iterator gleich std:: next ( first, n ) zurückgegeben.
  • Andernfalls wird last zurückgegeben.

Komplexität

1,2) Höchstens std:: distance ( first, last ) - n Zuweisungen.
3,4) Höchstens std:: distance ( first, last ) - n Zuweisungen oder Vertauschungen.

Ausnahmen

Die Überladungen mit einem Template-Parameter namens ExecutionPolicy melden Fehler wie folgt:

  • Wenn die Ausführung einer als Teil des Algorithmus aufgerufenen Funktion eine Exception wirft und ExecutionPolicy einer der Standard-Policies ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsdefiniert.
  • Wenn der Algorithmus keinen Speicher allozieren kann, wird std::bad_alloc geworfen.

Hinweise

Feature-Test Makro Wert Std Funktion
__cpp_lib_shift 201806L (C++20) std::shift_left und std::shift_right

Beispiel

#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); // hat keine Wirkung: 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, z.B. Segfault
}

Mögliche Ausgabe:

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

Siehe auch

(C++11)
verschiebt eine Reihe von Elementen an einen neuen Speicherort
(Funktions-Template)
verschiebt eine Reihe von Elementen in umgekehrter Reihenfolge an einen neuen Speicherort
(Funktions-Template)
rotiert die Reihenfolge der Elemente in einem Bereich
(Funktions-Template)
verschiebt Elemente in einem Bereich
(Algorithmus-Funktionsobjekt)