2017. 3. 23. 07:30
목차
1. Auto
2. range based for
3. enum class
4. non-static data member initializers
5. initializer lists
6. default / delete definition
7. override / final
8. emplacement
9. constexpr
10. lambda
11. random
12. thread
2. emplacement
이번 글은 emplacement에 대해서 정리해보도록 하겠습니다.
emplacement를 간단히 설명해보자면
- 오브젝트 생성과 컨테이너 추가를 한 번에 할 수 있다.
- STL의 대부분의 컨테이너에서 지원
- 요소의 생성자 인수를 받아서 컨테이너 내에서 오브젝트를 만든다.
- push_back() -> emplace_back()
- push_front() -> emplace_front()
- insert() -> emplace()
- push_back 에 비해 요소 추가 비용을 줄일 수 있다.
- 임시 오브젝트의 복사와 파괴 비용이 발생하지 않는다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const string str = "Hello World"; | |
// push_back | |
std::vector<std::string> vStr; | |
vStr.push_back(str); | |
vStr.push_back({str[0], 'e'}); | |
// emplacement | |
vStr.emplace_back("Hello~?"); | |
vStr.emplace_back(str); | |
vStr.emplace_back(10, 'a'); |
보시다시피 사용 방법은 기존 push_back 이나 insert와 동일하다.
다만 push_back이나 insert의 경우 내부적으로 값 복사가 발생하여 비용이 들었으나
emplace_back이나 emplace를 이용하면 값 복사 현상이 없어져서 더 적은 비용으로 기능을 수행할 수 있다!
어..나는 값 복사가 일어나는게 필요한대?
라고 한다면 기존 push_back이나 insert를 쓰면 된다.
'Programming > C++' 카테고리의 다른 글
[10편] Modern C++ 정리: lambda (3) | 2017.03.23 |
---|---|
[9편] Modern C++ 정리: constexpr (0) | 2017.03.23 |
[7편] Modern C++정리: override / final (0) | 2017.03.23 |
[6편] Modern C++정리: dafault / delete definition (0) | 2017.03.22 |
[4-5편] Modern C++정리: non-static data member initializers (0) | 2017.03.22 |