이것이 가능한지 궁금 해서요. 그렇다면 그렇게 할 수 있을지 궁금합니다. 가능하지 않다면 생성자 본문 중에 요소를 추가하기 만하면됩니다.STL Map에 생성자 초기화 목록의 요소 추가?
이상 적으로 나는 공사 후지도를 변경하지 않는 것이 좋습니다.
내가 뭘 하려는지 건설자 매개 변수에서 만든지도에 두 쌍을 추가하는 것입니다.
이것이 가능한지 궁금 해서요. 그렇다면 그렇게 할 수 있을지 궁금합니다. 가능하지 않다면 생성자 본문 중에 요소를 추가하기 만하면됩니다.STL Map에 생성자 초기화 목록의 요소 추가?
이상 적으로 나는 공사 후지도를 변경하지 않는 것이 좋습니다.
내가 뭘 하려는지 건설자 매개 변수에서 만든지도에 두 쌍을 추가하는 것입니다.
복사 구성이 가능합니다.지도를 작성하는 함수를 호출 할 수 있습니다!
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;
};
여분의 도구가 없으면 생성자가 지원하는 한 초기화 목록에서 표준 컨테이너 만 초기화 할 수 있습니다. 더 많은 정보가 필요하다면 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
합니다.
물론 OP는'map_list_of'를 대신 사용합니다. – rlbond
이상한 이유로 나는지도 부분을 겹쳐 씁니다. –
범위를 한 쌍의 반복자로 사용하는지도 생성자가 있습니다. 이를 사용하여 요구와 비슷한 것을 만들 수 있습니다.
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;
}
};
:
'생성자 매개 변수로부터의 '마지막 문장을 주면, 나는 당신이 그 지점을 놓치고 있다고 말할 것입니다 ... 제가 첫 시도에서했던 것처럼. –
초기화 블록에서 상당히 복잡한 반복자 산술을 사용하고 싶지 않고 부스트를 사용하는 옵션이 없으면 생성자 본문으로 강등됩니다. – Brian
아니, 복사 건설 잘 작동합니다. –
가 나는 초기화 클래스를 사용 처음부터 버림) C++의 return value optimization 때문에. 벡터 또는 다른 표준 컨테이너를 초기화하는 경우에도 동일한 작업을 수행 할 수 있습니다.
희망 하시겠습니까?
상당히 깨끗할 수 있습니다. 그러면 초기화 시간에 정의 된대로 새로 생성 된 맵을 상수로 만들 수 있습니까? – Brian
그렇습니다. 그렇다면 할당 연산자가 작동하지 않는다는 것을 의미합니다. –
+1 -지도가 크면 멋지지만 복사가 어렵습니다. –