C ++ std :: map具有用户定义的数据类型

时间:2014-05-18 13:06:28

标签: c++ c++11 stdmap

  

为不相交集实现类   


struct Set
{
    int parent,rank;
    Set(int i):parent(i),rank(0){}
    Set(const Set& s2):parent(s2.parent),rank(s2.rank){}
};


struct Disjoint
{
    std::map<int,Set> forest;
    Disjoint(){}
    void init_node(int i)
    {
        forest[i]=Set(i);//error here
    }
};

  

现在编译后我看到了,

/ usr / include / c ++ / 4.7 / bits / stl_map.h:458:错误:没有用于调用'Set :: Set()'的匹配函数
注:候选人是:
DU_SET.cpp:13:5:注意:Set :: Set(const Set&amp;)
DU_SET.cpp:13:5:注意:候选人需要1个参数,0提供
DU_SET.cpp:12:5:注意:Set :: Set(int)
DU_SET.cpp:12:5:注意:候选人需要1个参数,0提供*

  

我还为类Set实现了复制构造函数,但同样的错误再次出现。   当我实现另一个没有参数的构造函数时它工作正常,但为什么*

2 个答案:

答案 0 :(得分:0)

因为在声明中

forest[i]=Set(i);

forest[i]将尝试使用默认构造函数创建一个Set对象并放置在该位置。然后使用Set(i)创建另一个,并使用赋值运算符将其分配到 ith 位置。因此,您必须提供默认构造函数。

要避免使用std::map::insert方法。

forest.insert( {i, Set(i)} );

答案 1 :(得分:0)

使用std::map::emplacereference)直接在地图中构建对象:

forest.emplace(i, i);

注意:首先i将用于构建密钥,第二个i将用于构造对象Set