Namespaces
Variants

std:: move_iterator

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
헤더에 정의됨 <iterator>
template < class Iter >
class move_iterator ;
(C++11 이후)

std::move_iterator 는 기반 반복자(최소한 LegacyInputIterator 또는 input_iterator 개념을 모델하는 (C++20부터) , 또는 더 강력한 반복자 개념 (C++23부터) )와 정확히 동일하게 동작하는 반복자 어댑터입니다. 단, 역참조 시 기반 반복자가 반환하는 값을 rvalue로 변환한다는 점이 다릅니다. 이 반복자가 입력 반복자로 사용될 경우, 값이 복사되는 대신 이동됩니다.

목차

중첩 타입

유형 정의
iterator_type Iter
iterator_category std:: iterator_traits < Iter > :: iterator_category
value_type std:: iterator_traits < Iter > :: value_type
difference_type std:: iterator_traits < Iter > :: difference_type
pointer Iter
reference
(C++20 이전)
타입 정의
iterator_type Iter
iterator_category
(조건부 존재)
iterator_concept

std::input_iterator_tag

(C++23 이전)
(C++23 이후)
value_type std:: iter_value_t < Iter >
difference_type std:: iter_difference_t < Iter >
pointer Iter
reference std:: iter_rvalue_reference_t < Iter >
(C++20 이후)

데이터 멤버

멤버 설명
Iter current 기반 반복자
( 설명 전용 멤버 객체* )

멤버 함수

새로운 move_iterator 를 생성합니다
(public member function)
다른 move_iterator 를 할당합니다
(public member function)
기본 반복자에 접근합니다
(public member function)
가리키는 요소에 접근합니다
(public member function)
인덱스로 요소에 접근합니다
(public member function)
move_iterator 를 전진시키거나 후퇴시킵니다
(public member function)

비멤버 함수

(C++11) (C++11) (C++20에서 제거됨) (C++11) (C++11) (C++11) (C++11) (C++20)
기본 반복자를 비교함
(함수 템플릿)
기본 반복자와 기본 센티널을 비교함
(함수 템플릿)
(C++11)
반복자를 전진시킴
(함수 템플릿)
(C++11)
두 반복자 어댑터 간의 거리를 계산함
(함수 템플릿)
기본 반복자와 기본 센티널 간의 거리를 계산함
(함수 템플릿)
(C++20)
기본 반복자를 역참조한 결과를 해당 rvalue 참조 타입으로 변환함
(함수)
(C++20)
두 기본 반복자가 가리키는 객체를 교환함
(함수 템플릿)
인자에서 추론된 타입의 std::move_iterator 를 생성함
(함수 템플릿)

헬퍼 템플릿

template < class Iterator1, class Iterator2 >

requires ( ! std:: sized_sentinel_for < Iterator1, Iterator2 > )
constexpr bool disable_sized_sentinel_for

< std :: move_iterator < Iterator1 > , std :: move_iterator < Iterator2 >> = true ;
(C++20 이후)

std::disable_sized_sentinel_for 의 이 부분 특수화는 기본 반복자가 해당 개념을 만족하지 않을 경우 move_iterator 의 특수화들이 sized_sentinel_for 를 만족하지 못하도록 방지합니다.

참고 사항

기능 테스트 매크로 표준 기능
__cpp_lib_move_iterator_concept 202207L (C++23) std :: move_iterator < T * > 를 임의 접근 반복자로 만들기

예제

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <ranges>
#include <string>
#include <string_view>
#include <vector>
void print(const std::string_view rem, const auto& v)
{
    std::cout << rem;
    for (const auto& s : v)
        std::cout << std::quoted(s) << ' ';
    std::cout << '\n';
};
int main()
{
    std::vector<std::string> v{"this", "_", "is", "_", "an", "_", "example"};
    print("Old contents of the vector: ", v);
    std::string concat;
    for (auto begin = std::make_move_iterator(v.begin()),
              end = std::make_move_iterator(v.end());
         begin != end; ++begin)
    {
        std::string temp{*begin}; // *begin의 내용을 temp로 이동
        concat += temp;
    }
    // 클래스 템플릿 인수 추론을 도입한 C++17부터는
    // std::move_iterator의 생성자를 직접 사용할 수 있습니다:
    // std::string concat = std::accumulate(std::move_iterator(v.begin()),
    //                                      std::move_iterator(v.end()),
    //                                      std::string());
    print("New contents of the vector: ", v);
    print("Concatenated as string: ", std::ranges::single_view(concat));
}

가능한 출력:

Old contents of the vector: "this" "_" "is" "_" "an" "_" "example"
New contents of the vector: "" "" "" "" "" "" ""
Concatenated as string: "this_is_an_example"

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 2106 C++11 move_iterator 를 역참조하면
기본 반복자의 역참조가 prvalue를 반환할 경우
댕글링 참조가 반환될 수 있음
객체 자체를
반환하도록 변경
LWG 3736 C++20 move_iterator disable_sized_sentinel_for
특수화가 누락됨
추가됨
P2259R1 C++20 std:: iterator_traits < Iter > :: iterator_category 가 정의되지 않은 경우에도
멤버 iterator_category 가 정의됨
이 경우 iterator_category
정의하지 않음

참고 항목

인수에서 타입이 추론되는 std::move_iterator 를 생성합니다
(함수 템플릿)
std::move_iterator 를 위한 센티넬 어댑터
(클래스 템플릿)