[잡다한코딩] Map insert로 뭘 쓰지?

2016. 12. 21. 02:32엘키스공간/엘키스코딩공방

728x90
728x90

어느 날 아는 동생(디버프)에게 형은 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<intint> 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가 서로 생성자, 복사생성자를 다르게 부르는 경우가 어떤 경우일까?


흠 일단 모르겠다. 오늘은 요기까지...

728x90
반응형