std:: move_iterator
|
헤더에 정의됨
<iterator>
|
||
|
template
<
class
Iter
>
class move_iterator ; |
(C++11 이후) | |
std::move_iterator
는 기반 반복자(최소한
LegacyInputIterator
또는
input_iterator
개념을 모델하는
(C++20부터)
, 또는 더 강력한 반복자 개념
(C++23부터)
)와 정확히 동일하게 동작하는 반복자 어댑터입니다. 단, 역참조 시 기반 반복자가 반환하는 값을 rvalue로 변환한다는 점이 다릅니다. 이 반복자가 입력 반복자로 사용될 경우, 값이 복사되는 대신 이동됩니다.
목차 |
중첩 타입
|
(C++20 이전) | ||||||||||||||||||||
|
(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++20)
|
기본 반복자와 기본 센티널을 비교함
(함수 템플릿) |
|
(C++11)
|
반복자를 전진시킴
(함수 템플릿) |
|
(C++11)
|
두 반복자 어댑터 간의 거리를 계산함
(함수 템플릿) |
|
(C++20)
|
기본 반복자와 기본 센티널 간의 거리를 계산함
(함수 템플릿) |
|
(C++20)
|
기본 반복자를 역참조한 결과를 해당 rvalue 참조 타입으로 변환함
(함수) |
|
(C++20)
|
두 기본 반복자가 가리키는 객체를 교환함
(함수 템플릿) |
|
(C++11)
|
인자에서 추론된 타입의
std::move_iterator
를 생성함
(함수 템플릿) |
헬퍼 템플릿
|
template
<
class
Iterator1,
class
Iterator2
>
requires
(
!
std::
sized_sentinel_for
<
Iterator1, Iterator2
>
)
|
(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
를
정의하지 않음 |
참고 항목
|
(C++11)
|
인수에서 타입이 추론되는
std::move_iterator
를 생성합니다
(함수 템플릿) |
|
(C++20)
|
std::move_iterator
를 위한 센티넬 어댑터
(클래스 템플릿) |