더북(TheBook)

5. 삽입 위치에 초기화 리스트로 원소들을 삽입한다. 두 번째 인수에는 삽입할 원소들의 초기화 리스트를 지정한다.

iter = words.insert(std::end(words), {std::string {"twelve"}, std::string {"thirteen"}});

삽입 위치는 마지막 원소에서 하나 더 뒤이므로 초기화 리스트의 원소들은 끝에 추가된다. 이 문장을 실행하면 words 벡터는 다음과 같은 string 객체를 갖는다.

"one" "two" "three" "five" "six" "seven" "eight" "nine" "nine" "ten" "twelve" "thirteen"

이어서 삽입된 원소들 중에 첫 번째 원소 "twelve"를 가리키는 반복자를 반환한다. 초기화 리스트의 값은 반드시 컨테이너 원소들의 타입과 일치해야 한다. 타입 T의 값들의 초기화 리스트는 std::initializer_list<T> 타입이므로 여기서 초기화 리스트의 타입은 std::initializer_list<std::string>가 된다. 이전 insert() 호출에서 리터럴이 인수로 쓰인 부분은 매개변수 타입이 std::string이었으므로 리터럴을 함수에 전달된 string 객체를 초기화하는 값으로 쓸 수 있었다.

std::vector<std::string> str {"one", "two", "one", "three"};
auto riter = std::find(std::rbegin(str), std::rend(str), "one");
 
str.insert(riter.base(), "five");

find() 알고리즘은 처음 두 인수로 지정된 범위를 검색해 세 번째 인수와 일치하는 원소를 찾는다. 여기서는 string("one)을 찾고 있다. find() 알고리즘은 범위 지정에 사용할 수 있는 타입의 반복자를 반환한다. find() 알고리즘은 발견한 원소를 가리키는 역방향 반복자 또는 원소를 발견하지 못하면 첫 번째 원소 하나 더 앞을 가리키는 rend(str)이 된다. 역방향 반복자를 사용하면 일치하는 마지막 원소를 찾는다. 표준 반복자를 사용하면 일치하는 첫 번째 원소 또는 원소를 발견하지 못하면 end(str)을 반환한다. riterbase() 함수 멤버를 호출하면 역방향(순차열에서 끝 방향)으로 iter 앞에 위치를 가리키는 표준 반복자를 반환한다. riter"one"을 갖는 세 번째 원소를 가리키므로 riter.base()"three"를 갖는 네 번째 원소를 가리키게 된다. insert()에 첫 번째 인수로 riter.base()를 사용했으므로 해당 위치 앞에 "five"가 삽입되는 결과가 된다. 즉, riter가 가리키는 원소 뒤에 삽입된다. 이 문장들을 실행한 뒤에 strstring 원소 다섯 개가 된다.

"one", "two", "one", "five", "three"

find()가 반환한 위치 앞에 삽입하고 싶은 거라면 insert()의 첫 번째 인수를 iter.base()-1로 지정하면 된다.

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