Namespaces
Variants

std::ranges::move_backward, std::ranges::move_backward_result

cppreference.net에서 가져옴
 
 
알고리즘 라이브러리
제약 알고리즘 및 범위에 대한 알고리즘 (C++20)
제약 알고리즘, 예: ranges::copy, ranges::sort, ...
정렬 및 관련 연산
분할 연산
(C++11)    

정렬 연산
이진 탐색 연산
(분할된 범위에 대해)
집합 연산 (정렬된 범위에 대해)
병합 연산 (정렬된 범위에 대해)
힙 연산
최소/최대 연산
(C++11)
(C++17)
사전식 비교 연산
순열 연산


 
제약 알고리즘
이 메뉴의 모든 이름은 std::ranges
네임스페이스에 속합니다.
(C++23)
unique_copy
stable_partition
partial_sort_copy
equal_range
set_symmetric_difference
pop_heap
clamp
prev_permutation
fold_left
fold_left_first  
fold_right
fold_right_last  
fold_left_with_iter
fold_left_first_with_iter
(C++23)
iota            
(C++23)
generate_random
(C++26)
uninitialized_value_construct_n
 
(C++23)<algorithm>
헤더
template< std::bidirectional_iterator I1, std::sentinel_for<I1> S1,
          std::bidirectional_iterator I2 >
requires std::indirectly_movable<I1, I2>
constexpr move_backward_result<I1, I2>
    move_backward( I1 first, S1 last, I2 d_last );
에 정의됨 호출 시그니처
template< ranges::bidirectional_range R, std::bidirectional_iterator I >
requires std::indirectly_movable<ranges::iterator_t<R>, I>
constexpr move_backward_result<ranges::borrowed_iterator_t<R>, I>
    move_backward( R&& r, I d_last );
(1) (C++20부터)
(2)
template< class I, class O >
using move_backward_result = ranges::in_out_result<I, O>;
(C++20부터) 도우미 타입
(3) (C++20부터)[first, last)1)[d_last - N, d_last) N = ranges::distance(first, last)에 의해 정의된 범위의 요소들을 다른 범위 d_last로 이동시킵니다. 여기서 (first, last]입니다. 요소들은 역순으로 이동되며(마지막 요소가 먼저 이동됨), 상대적 순서는 유지됩니다. 가 내에 있으면 동작이 정의되지 않습니다. 이러한 경우
ranges::move를 대신 사용할 수 있습니다.2) r(1)ranges::begin(r)과 동일하지만, 소스 범위로 first를 사용하며, 이는 ranges::end(r)를 last로,

를 로 사용하는 것과 같습니다.이동된 범위의 요소들은 여전히 적절한 타입의 유효한 값을 포함하지만, *(d_last - n) = ranges::iter_move(last - n)를 각 정수 n에 대해 사용하는 것과 같이 이동 전과 반드시 같은 값은 아닙니다. 여기서 0 ≤ n < N입니다.

이 페이지에 설명된 함수형 엔터티는 알고리즘 함수 객체(비공식적으로 niebloids라고 함)입니다. 즉:

  • 이들 중 하나를 호출할 때 명시적 템플릿 인자 목록을 지정할 수 없습니다.
  • 이들 중 어느 것도 인자 종속 검색에 보이지 않습니다.
  • 이들 중 하나가 함수 호출 연산자의 왼쪽에 있는 이름으로 일반적인 비한정 검색에 의해 발견되면, 인자 종속 검색이 억제됩니다.

매개변수

first, last - 이동할 요소들의 범위 를 정의하는 반복자-감시자 쌍
r - 이동할 요소들의 범위
d_last - 대상 범위의 끝

반환값

{ last, d_last - N } .

복잡도

1) 정확히 N 번의 이동 할당.
2) 정확히 ranges:: distance ( r ) 번의 이동 할당.

참고 사항

겹치는 범위를 이동할 때, ranges::move 는 왼쪽으로 이동할 때(대상 범위의 시작이 소스 범위 밖에 있을 때) 적합한 반면, ranges::move_backward 는 오른쪽으로 이동할 때(대상 범위의 끝이 소스 범위 밖에 있을 때) 적합합니다.

가능한 구현

struct move_backward_fn
{
    template<std::bidirectional_iterator I1, std::sentinel_for<I1> S1,
             std::bidirectional_iterator I2>
    requires std::indirectly_movable<I1, I2>
    constexpr ranges::move_backward_result<I1, I2>
        operator()(I1 first, S1 last, I2 d_last) const
    {
        auto i {last};
        for (; i != first; *--d_last = ranges::iter_move(--i))
        {}
        return {std::move(last), std::move(d_last)};
    }
    template<ranges::bidirectional_range R, std::bidirectional_iterator I>
    requires std::indirectly_movable<ranges::iterator_t<R>, I>
    constexpr ranges::move_backward_result<ranges::borrowed_iterator_t<R>, I>
        operator()(R&& r, I d_last) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::move(d_last));
    }
};
inline constexpr move_backward_fn move_backward {};

예제

#include <algorithm>
#include <iostream>
#include <string>
#include <string_view>
#include <vector>
using Vec = std::vector<std::string>;
void print(std::string_view rem, Vec const& vec)
{
    std::cout << rem << "[" << vec.size() << "]: ";
    for (const std::string& s : vec)
        std::cout << (s.size() ? s : std::string{"·"}) << ' ';
    std::cout << '\n';
}
int main()
{
    Vec a{"▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"};
    Vec b(a.size());
    print("Before move:\n" "a", a);
    print("b", b);
    std::ranges::move_backward(a, b.end());
    print("\n" "Move a >> b:\n" "a", a);
    print("b", b);
    std::ranges::move_backward(b.begin(), b.end(), a.end());
    print("\n" "Move b >> a:\n" "a", a);
    print("b", b);
    std::ranges::move_backward(a.begin(), a.begin()+3, a.end());
    print("\n" "Overlapping move a[0, 3) >> a[5, 8):\n" "a", a);
}

가능한 출력:

Before move:
a[8]: ▁ ▂ ▃ ▄ ▅ ▆ ▇ █
b[8]: · · · · · · · ·
Move a >> b:
a[8]: · · · · · · · ·
b[8]: ▁ ▂ ▃ ▄ ▅ ▆ ▇ █
Move b >> a:
a[8]: ▁ ▂ ▃ ▄ ▅ ▆ ▇ █
b[8]: · · · · · · · ·
Overlapping move a[0, 3) >> a[5, 8):
a[8]: · · · ▄ ▅ ▁ ▂ ▃

참고

요소 범위를 새 위치로 이동합니다
(알고리즘 함수 객체)
요소 범위를 새 위치로 복사합니다
(알고리즘 함수 객체)
요소 범위를 역순으로 복사합니다
(알고리즘 함수 객체)
(C++11)
요소 범위를 새 위치로 이동합니다
(함수 템플릿 & 알고리즘 함수 객체)
(C++11)
인수를 xvalue로 변환합니다
(함수 템플릿)