C ++ 20에서 <algorithm>
헤더는 두 개의 새로운 알고리즘을 얻는다 : shift_left()
와shift_right()
. 둘 다 LegacyForwardIterator를 허용합니다. 에 대해 shift_left()
, "이동은 i
시작부터 시작 하여 증가하는 순서로 수행됩니다 0
"; 에 대해 shift_right()
" ForwardIt
LegacyBidirectionalIterator 요구 사항을 충족하는 경우 이동은 i
시작 순서에서 내림차순으로 수행됩니다 last - first - n - 1
"로 지정됩니다.
구현하기 위해 합리적으로 쉬운 방법을 생각할 수 있습니다 shift_left()
.
template <typename ForwardIt>
constexpr inline ForwardIt shift_left(ForwardIt first, ForwardIt last, typename std::iterator_traits<ForwardIt>::difference_type n) {
if (n <= 0) return last;
ForwardIt it = first;
for (; n > 0; --n, ++it) {
if (it == last) return first;
}
return std::move(it, last, first);
}
ForwardIt
LegacyBidirectionalIterator 요구 사항을 충족하는 경우 shift_right()
와 매우 유사한 방식으로 구현 될 수 있음을 알 수 있습니다 shift_left()
. 그러나 shift_right()
비 양방향 순방향 반복자 에 대해 어떻게 구현할 수 있는지는 명확하지 않습니다 .
[first, first+n)
요소 교환을 위해 스크래치 공간으로 공간을 사용하는 알고리즘을 찾았 지만 shift_left()
위 의 알고리즘보다 약간 더 낭비 적입니다 .
template <typename ForwardIt>
constexpr inline ForwardIt shift_right(ForwardIt first, ForwardIt last, typename std::iterator_traits<ForwardIt>::difference_type n) {
if (n <= 0) return first;
ForwardIt it = first;
for (; n > 0; --n, ++it) {
if (it == last) return last;
}
ForwardIt ret = it;
ForwardIt ret_it = first;
for (; it != last; ++it) {
std::iter_swap(ret_it, it);
ret_it++;
if (ret_it == ret) ret_it = first;
}
return ret;
}
더 나은 또는 "의도 된"구현 방법이 shift_right()
있습니까?
std::move
합니다std::copy
.