在构造函数初始化列表中向STL Map添加元素?

时间:2009-11-04 15:15:16

标签: c++ stl map initialization

我想知道这是否可能,如果是这样的话我怎么会这样做。如果不可能,我只需要在构造函数体中添加元素。

理想情况下,我希望地图在构造后不可变。

我想要实现的是在地图中添加两对从构造函数参数创建的对。

4 个答案:

答案 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,这是免费的(因为你没有构建地图,复制它,然后扔掉第一个地图)。初始化矢量或其他标准容器也可以做同样的事情。

希望有所帮助!