더북(TheBook)

2.4.4 deque 컨테이너의 내용을 대체하기

dequeassign() 함수 멤버는 기존 원소들을 모두 대체한다. assign()은 세 가지 버전이 있다. 새로운 내용을 초기화 리스트로 채우는 버전, 새로운 내용을 반복자로 지정한 범위로 채우는 버전, 새로운 내용을 특정 객체의 복제본으로 채우는 버전이 있다. 다음은 deque 컨테이너의 내용을 초기화 리스트의 원소들로 대체한다.

std::deque<std::string> words {“one”, “two”, “three”, “four”};
auto init_list = {std::string{“seven”}, std::string{“eight”}, std::string{“nine”}};
words.assign(init_list);

마지막 문장은 words에 있는 원소들을 init_list에 있는 string 객체들로 대체한다. 초기화 리스트에 단순히 리터럴을 쓸 수 없다는 점에 주의하자. 리터럴을 썼다면 init_list의 타입은 initializer_list<const char*>로 추론될 텐데 assign()initializer_list<string> 타입을 인수로 받아야 하므로 코드가 컴파일되지 않을 것이다. 물론, init_list를 따로 정의하지 않아도 된다. 다음처럼 assign()을 호출할 때 인수에서 초기화 리스트를 정의해도 된다.

words.assign({“seven”, “eight”, “nine”});

wordsassign() 멤버는 initializer_list<string> 타입을 인수로 기대하므로 컴파일러는 리터럴을 사용해 초기화 리스트를 이 타입으로 생성해서 처리해줄 것이다. deque 컨테이너를 범위로 채우려면 범위를 두 반복자로 지정하면 된다.

std::vector<std::string> wordset {“this”, “that”, “these”, “those”};
words.assign(std::begin(wordset)+1, std::end(wordset)); // Assigns “that” and “these”

assign() 함수는 입력 반복자만 필요하므로 어떤 카테고리의 반복자라도 범위 지정에 쓸 수 있다. 마지막은 컨테이너의 내용을 특정 객체로 대체하는 것이다.

words.assign(8, “eight”); // string(“eight”) 인스턴스 8개를 할당한다
 

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