std::forward_list
에서는 증가 연산만 가능template< class InputIt, class Distance >
void advance( InputIt& it, Distance n );```
template< class InputIt, class Distance >
constexpr void advance( InputIt& it, Distance n );```
template< class InputIt >
InputIt next( InputIt it, typename std::iterator_traits<InputIt>::difference_type n = 1 );```
template< class BidirIt >
BidirIt prev( BidirIt it, typename std::iterator_traits<BidirIt>::difference_type n = 1 );```
template< class InputIt >
constexpr InputIt next( InputIt it, typename std::iterator_traits<InputIt>::difference_type n = 1 );```
template< class BidirIt >
constexpr BidirIt prev( BidirIt it, typename std::iterator_traits<BidirIt>::difference_type n = 1 );```
template< std::input_or_output_iterator I >
constexpr I next( I i, std::iter_difference_t<I> n );
template< std::bidirectional_iterator I >
constexpr I prev( I i, std::iter_difference_t<I> n );
#include <iostream>
#include <forward_list>
#include <vector>
using namespace std;
int main()
{
// 벡터로 최근 경기 우승자 명단 작성
vector<string> vec = {
"Lewis Hamilton", "Lewis Hamilton", "Nico Roseberg",
"Sebastian Vettel", "Lewis Hamilton", "Sebastian Vettel",
"Sebastian Vettel", "Sebastian Vettel", "Fernando Alonso"
};
auto it = vec.begin(); // 상수 시간 = O(1)
cout << "가장 최근 우승자: " << *it << endl;
it += 8; // 상수 시간
cout << "8년 전 우승자: " << *it << endl;
advance(it, -3); // 상수 시간
cout << "그후 3년 뒤 우승자: " << *it << endl;
// forward_list로 같은 작업 수행
forward_list<string> fwd(vec.begin(), vec.end());
auto it1 = fwd.begin();
cout << "가장 최근 우승자: " << *it1 << endl;
advance(it1, 5); // 선형 시간 = O(n)
cout << "5년 전 우승자: " << *it1 << endl;
// forward_list는 순방향으로만 이동할 수 있음
// 런타임 에러 발생
// advance(it1, -2);
// forward_list의 iterator는 += 연산자가 정의되어 있지 않음
// 컴파일 에러 발생
// it1 += 2;
}
실행 결과
advance(it1, -2) 주석 해제 시
it1 += 2 주석 해제 시