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]"
}