我想知道这是否可能,如果是这样的话我怎么会这样做。如果不可能,我只需要在构造函数体中添加元素。
理想情况下,我希望地图在构造后不可变。
我想要实现的是在地图中添加两对从构造函数参数创建的对。
答案 0 :(得分: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;
};
答案 1 :(得分:4)
如果没有额外的工具,只能在构造函数支持的情况下在初始化列表中初始化std容器。如果你需要更多,来自Boost.Assign的map_list_of()
等人做得很好。
Boost.Assign in action:
class C
{
const std::map<int,int> _vi;
public:
C() : _vi(boost::assign::map_list_of(1,1)(2,1)(3,2)) {}
}
编辑:已更新为std::map
示例。
答案 2 :(得分:3)
有一个map构造函数,它将一个范围作为一对迭代器。使用它,您可以构建类似于您的需求的东西:
pair<int, int> init[] = { make_pair(1, 2), make_pair(2, 3) };
map<int, int> const mymap(init, init + 2);
当然,不漂亮。 下一版本的C ++将更好地支持初始化列表。在那之前,Boost.Assign是下一个最好的东西。
答案 3 :(得分:2)
我使用初始化类:
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;
}
};
然后使用它:
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" ) )
{}
};
由于C ++的return value optimization,这是免费的(因为你没有构建地图,复制它,然后扔掉第一个地图)。初始化矢量或其他标准容器也可以做同样的事情。
希望有所帮助!