더북(TheBook)

distance()의 인수는 범위를 지정하므로 첫 번째 인수는 시작 반복자이고, 두 번째 인수는 끝 반복자다. 순방향 반복자를 둘 이상 증가시켜야 할 때는 iterator 헤더에 정의된 advance() 함수가 유용하다. 예제로 advance() 함수의 사용법을 보자.

std::forward_list<int> data {10, 21, 43, 87, 175, 351};
auto iter = std::begin(data);
size_t n {3};
std::advance(iter, n);
std::cout << “The “ << n+1 << “th element is “ << *iter << std::endl; // 87을 출력

여기에 어떤 마법이 있는 것은 아니다. advance() 함수는 순방향 반복자를 필요한 횟수만큼 증가시킬 뿐이다. 루프를 작성해서 처리하는 수고를 덜어준다. advance() 함수는 첫 번째 인수로 받은 반복자를 증가시키지만, 반환하지는 않는다. 즉, advance()의 반환 타입은 void이다.

list 컨테이너에서 새 원소를 삽입하거나 다른 컨테이너의 원소들을 잘라 붙이는 연산은 원소 앞에 적용되지만, forward_list 컨테이너의 링크는 전부 순방향뿐이어서 원소 삽입이나 잘라 붙이기가 원소 뒤에서 일어난다. 이러한 이유 때문에 list 컨테이너의 insert(), splice() 대신에 forward_list 컨테이너는 splice_after(), insert_after()를 제공한다. 이름이 의미하는 것처럼 forward_list에서 지정 위치 뒤에 원소를 삽입하거나 잘라 붙인다. forward_list의 시작에 원소를 삽입하거나 잘라 붙이고 싶을 때는 이들 연산에 여전히 문제가 있다. 즉, 원소 앞에 삽입이나 잘라 붙이기를 할 수 없고, 이는 첫 번째 원소일 때도 마찬가지다. 이 문제는 첫 번째 원소에서 하나 더 앞을 가리키는 const 반복자나 non-const 반복자를 반환하는 cbefore_begin(), before_begin() 함수를 이용해서 해결할 수 있다. 이들 반복자를 사용해서 forward_list 컨테이너의 앞에 원소를 삽입하거나 잘라 붙일 수 있다.

std::forward_list<std::string> my_words {“three”, “six”, “eight”};
std::forward_list<std::string> your_words {“seven”, “four”, “nine”};
my_words.splice_after(my_words.before_begin(), your_words, ++std::begin(your_words));
 

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.