더북(TheBook)

insert()의 첫 번째 인수는 삽입 위치를 지정하는 반복자이고, 두 번째 인수는 삽입될 원소다. begin()이 반환한 양방향 반복자를 증가시켜서 두 번째 원소를 가리키게 했다. 코드를 실행한 이후에 리스트는 다음과 같이 바뀐다.

55 66 55 55 55 55 55 55 55 55 55

리스트는 이제 원소 11개를 갖는다. 원소를 삽입한다고 기존 원소를 이동할 필요가 없다. 새 원소를 생성하고 원소를 삽입하는 과정은 포인터 4개를 적절히 설정하는 것뿐이다. 첫 번째 원소의 다음(next) 포인터를 새 원소로 바꾸고, 원래 두 번째 원소의 이전(previous) 포인터를 새 원소로 바꾼다. 이어서 새 원소의 이전 포인터를 첫 번째 원소로 설정하고, 다음 포인터를 원래 두 번째 원소로 설정한다. 이 과정은 vectordeque의 삽입과 비교하면 매우 빠르고, 새 원소를 어느 위치에 삽입해도 같은 시간에 처리된다.

원하는 위치에 같은 원소의 복제본을 여러 개 삽입할 수도 있다.

auto iter = begin(data);
std::advance(iter, 9);            // iter를 9만큼 증가시킨다
data.insert(iter, 3, 88);         // 10번째 위치에 88의 복제본을 3개 삽입한다

iterlist<int>::iterator 타입이 될 것이다. insert() 함수의 첫 번째 인수는 삽입 위치를 지정하는 반복자이고, 두 번째 인수는 삽입할 원소의 개수, 세 번째 인수는 반복해서 삽입할 원소다. 10번째 원소 위치를 얻으려면 iterator 헤더에 정의되어 있는 advance() 전역 함수를 사용해서 반복자를 9만큼 증가시켜야 한다. 양방향 반복자는 증가 또는 감소 연산만 할 수 있다. 따라서 반복자에 9를 더하는 건 할 수 없다. advance() 함수는 루프 안에서 반복자를 증가시킬 것이다. 이전 코드 조각을 실행한 후에 이 코드를 실행했다면 리스트는 다음과 같다.

55 66 55 55 55 55 55 55 55 88 88 88 55 55
 

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