2009-11-04 4 views
1

이것이 가능한지 궁금 해서요. 그렇다면 그렇게 할 수 있을지 궁금합니다. 가능하지 않다면 생성자 본문 중에 요소를 추가하기 만하면됩니다.STL Map에 생성자 초기화 목록의 요소 추가?

이상 적으로 나는 공사 후지도를 변경하지 않는 것이 좋습니다.

내가 뭘 하려는지 건설자 매개 변수에서 만든지도에 두 쌍을 추가하는 것입니다.

답변

10

복사 구성이 가능합니다.지도를 작성하는 함수를 호출 할 수 있습니다!

std::map<int,int> myFunc(int a, int b); 

class MyObject 
{ 
public: 
    MyObject(int a, int b): m_map(myFunc(a,b)) {} 

private: 
    std::map<int,int> m_map; 
}; 
+0

상당히 깨끗할 수 있습니다. 그러면 초기화 시간에 정의 된대로 새로 생성 된 맵을 상수로 만들 수 있습니까? – Brian

+0

그렇습니다. 그렇다면 할당 연산자가 작동하지 않는다는 것을 의미합니다. –

+0

+1 -지도가 크면 멋지지만 복사가 어렵습니다. –

4

여분의 도구가 없으면 생성자가 지원하는 한 초기화 목록에서 표준 컨테이너 만 초기화 할 수 있습니다. 더 많은 정보가 필요하다면 Boost.Assign의 map_list_of() 등이 훌륭한 일을합니다. 행동

Boost.Assign :

class C 
{ 
    const std::map<int,int> _vi; 
public: 
    C() : _vi(boost::assign::map_list_of(1,1)(2,1)(3,2)) {} 
} 

편집 : 업데이트 예를 std::map합니다.

+1

물론 OP는'map_list_of'를 대신 사용합니다. – rlbond

+0

이상한 이유로 나는지도 부분을 겹쳐 씁니다. –

3

범위를 한 쌍의 반복자로 사용하는지도 생성자가 있습니다. 이를 사용하여 요구와 비슷한 것을 만들 수 있습니다.

pair<int, int> init[] = { make_pair(1, 2), make_pair(2, 3) }; 
map<int, int> const mymap(init, init + 2); 

허용되지 않습니다. C++의 다음 버전은 초기화 목록을 더 잘 지원합니다. 그때까지 Boost.Assign은 차선책입니다. 이 무료

class C 
{ 
    const std::map<int,const char*> m_map; 

public:   
    C() : m_map(MapInitializer<int,const char*>() 
      .Add(1, "Hi there") 
      .Add(2, "In the middle") 
      .Add(9, "Goodbye")) 
    {} 
}; 

(당신이 그것을 복사,지도를 구축하지 않는 의미에서 : 사용하도록 넣어 다음

template<class K, class V> 
class MapInitializer 
{ 
    std::map<K,V> m; 
public: 
    operator std::map<K,V>() const 
    { 
     return m; 
    } 

    MapInitializer& Add(const K& k, const V& v) 
    { 
     m[ k ] = v; 
     return *this; 
    } 
}; 

:

+1

'생성자 매개 변수로부터의 '마지막 문장을 주면, 나는 당신이 그 지점을 놓치고 있다고 말할 것입니다 ... 제가 첫 시도에서했던 것처럼. –

+0

초기화 블록에서 상당히 복잡한 반복자 산술을 사용하고 싶지 않고 부스트를 사용하는 옵션이 없으면 생성자 본문으로 강등됩니다. – Brian

+0

아니, 복사 건설 잘 작동합니다. –

2

가 나는 초기화 클래스를 사용 처음부터 버림) C++의 return value optimization 때문에. 벡터 또는 다른 표준 컨테이너를 초기화하는 경우에도 동일한 작업을 수행 할 수 있습니다.

희망 하시겠습니까?