std::move_iterator

std::move_iterator (이동 반복자)

기본 반복자와 정확히 같게 동작하되, 역참조 시 기본 반복자가 돌려주는 값을 rvalue로 변환하는 반복자 어댑터예요. 입력 반복자로 쓰면 값을 복사하지 않고 이동해요. C++11부터 있어요.

출처: cppreference

본문

<iterator> 헤더에 정의돼 있어요.

template< class Iter >
class move_iterator;

std::move_iterator는 기본 반복자(최소 LegacyInputIterator이거나 C++20부터는 input_iterator, 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 reference가 참조 타입이면 그 rvalue 참조 버전, 아니면 원본 reference (C++20까지)

C++20부터는 iterator_concept, 조건부 iterator_category를 포함해 컨셉 기반으로 달라져요.

멤버 함수

  • (constructor) — 이동 반복자를 생성해요(기본, 다른 move_iterator, 기본 반복자에서).
  • operator= — 내용을 할당해요.
  • base — 기본 반복자를 돌려줘요.
  • operator* — 이동된(불변형 rvalue) 값을 돌려줘요.
  • operator-> — 이동된 값을 가리켜요.
  • operator[] — 이동된 값에 대한 첨자 연산.

비멤버 함수

  • operator==, operator!=, operator<, operator<=> 등 — 비교.
  • operator+ / operator- / advance, distance — 산술.
  • iter_move, iter_swap — 이동 지원.

예제

#include <iostream>
#include <iterator>
#include <vector>
#include <string>

int main()
{
    std::vector<std::string> s{"a", "b"};
    std::vector<std::string> t(std::make_move_iterator(s.begin()),
                               std::make_move_iterator(s.end()));
    std::cout << (s[0].empty() ? "[moved]" : s[0]) << '\n'; // "[moved]"
}

더 알아보기 (Learn more)

cppreference