2016. 12. 21. 02:32ㆍ엘키스공간/엘키스코딩공방
어느 날 아는 동생(디버프)에게 형은 map에 insert 할 때 뭘로 해요? 라는 질문을 받았다.
나는 보통 make_pair를 지금껏 사용하고 있었는데 사실.. 맵알못이라 그냥 저걸 사용했다.
그래서 공부를 하는 겸 이것 저것 찾아봤더니
value_type, pair, make_pair 이렇게 세 가지로 주로 사용하고 있다.
세간에 알려진 바로는 value_type가 제일 빠르다고 한다.
회사에서도 value_type으로 된 코드들을 꽤 많이 본 것 같다.
어떤 블로그에서 본 예시
make_pair가 실제로 느리다고 한 코드다.
1 2 3 4 5 6 7 8 | std::map<int, int> tmpMap; for (size_t i = 0; i < 1000000; i++) { //tmpMap.insert(std::map<int, int>::value_type(i, i)); // 12896 //tmpMap.insert(std::pair<int, int>(i, i)); //12752 tmpMap.insert(std::make_pair(i, i)); // 12744 } | cs |
코드는 대충 이런식인데 주석으로 단 것은 ctime 헤더로 clock으로 시간차를 구한 것이다.
사실상.. 별 차이가 없다. 블로그의 글에선 반복문도 아니고 인자로 1,1만 넣었던데 어떤 근거로 make_pair가 느리다는건진 잘 모르겠다.
다른 블로그들도 대부분 느리다고만 되어있고 제대로 된 예시가 없다.
make_pair에 float이나 double 타입을 넣는 것은 논외로 한다.
애초에 다른 형을 넣는다는거 자체가 말이;
스택오버플로우나 여러 블로그에서 생성자, 소멸자 중복 호출이 주로 많이 거론되었다.
생성자, 소멸자 정의
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class MyClass { public: MyClass() { std::cout << "Default Constructor" << std::endl; } ~MyClass() { std::cout << "Destructors" << std::endl; } MyClass(const MyClass&) { std::cout << "Copy Constructor" << std::endl; } MyClass(MyClass&&) { std::cout << "Move Constructor" << std::endl; } MyClass& operator=(const MyClass&) { std::cout << "Copy Assignment" << std::endl; return *this; } MyClass& operator=(MyClass&&) { std::cout << "Move Assignment" << std::endl; return *this; } bool operator<(const MyClass&) const { return false; } private: }; | cs |
혹시나 해서 move 생성자도 만들어봤다.
make_pair
1 2 3 4 5 6 7 | MyClass m1; for (size_t i = 0; i < 2; i++) { map1.insert(std::make_pair(i, m1)); // map1.insert(MyClassMap::value_type(i, m1)); std::cout << i <<": insert complete" << std::endl; } | cs |
Default Constructor
Copy Constructor
Move Constructor
Destructors
0: insert complete
Copy Constructor
Move Constructor
Destructors
1: insert complete
value_type
Default Constructor
Copy Constructor
Move Constructor
Destructors
0: insert complete
Copy Constructor
Move Constructor
Destructors
1: insert complete
일단 생성자나 소멸자가 호출 되는 것도 별 차이는 없다.
두 for문 모두 10000번으로 테스트 해봤다.
make_pair: 12139, value_type: 12156
인데.. 사실상 별 차이는 없다. 생성자 소멸자 불리는게 같으니 뭐 당연한거긴 하겠지만..
make_pair와 value_type가 서로 생성자, 복사생성자를 다르게 부르는 경우가 어떤 경우일까?
흠 일단 모르겠다. 오늘은 요기까지...
'엘키스공간 > 엘키스코딩공방' 카테고리의 다른 글
[잡다한코딩] 플로이드워셜 알고리즘 짜보기 (2) | 2017.01.07 |
---|---|
[잡다한코딩] 조건에 따라 enum 값 리턴하는 람다펑션 만들어보기 (4) | 2016.12.11 |
counted_ptr 구현 (0) | 2015.07.28 |
비트 조작 유틸로 만들기 (0) | 2015.07.13 |
더블 링크드 리스트 (1) | 2015.06.21 |
싱글 링크드 리스트 (0) | 2015.06.21 |
큐로 메시지 큐 구현하기 (0) | 2015.06.10 |