如何将地图转换为集合

时间:2014-10-17 12:53:02

标签: c++ map set

我在尝试将地图转换为集合时遇到了一些问题 我用这个成员数据获得了一个“Chanson”对象:

std::map<std::string,Artiste*> m_interpretes;

以下是我将*Artiste添加到地图的方式:

void Chanson::addArtiste(Artiste* a) throw (ExceptionArtiste, ExceptionLangueIncompatible)
{
    if(a!=NULL)
    {
        if(a->getLangue() == this->getLangue())
        {
            m_interpretes.insert(pair<string, Artiste*>(a->getNom(), a));
            //m_interpretes[a->getNom()] = a;
        }
        else
        {
            throw ExceptionLangueIncompatible(a,this);
        }
    }
}




set<Artiste*> Chanson::getArtistes() const
{
    //set<Artiste*> machin;
    return set<Artiste*> (m_interpretes.begin(), m_interpretes.end());
}

由于此功能,我收到了此错误:

  

错误C2664:'std :: pair&lt; _Ty1,_Ty2&gt; std :: set&lt; _Kty&gt; :: insert(Artiste *&amp;&amp;):不可能de convertirleparamètre1de const std :: pair&lt; _Ty1,_Ty2&gt; en'Artiste *&amp;&amp;' c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ set 179 1

知道怎么解决吗?

3 个答案:

答案 0 :(得分:3)

映射是关联数据结构,而集合只包含无序的项集合,因此添加一对(键,值)对后者无效,仅适用于前者。

要从set制作map个键,您可以

std::set<Artiste*> tempSet;
std::transform(m_interpretes.cbegin(), m_interpretes.cend(),
               std::inserter(tempSet, tempSet.begin()),
               [](const std::pair<std::string, Artiste*>& key_value)
               { return key_value.second; });
return tempSet;

答案 1 :(得分:3)

问题在于:

return set<Artiste*> (m_interpretes.begin(), m_interpretes.end());

如果您查看从map::begin()map::end()函数获得的类型,您会看到获得std::pair<string, Artiste*>的迭代器。

问题是set::insert()函数期望给它的迭代器是Artiste*类型。

最简单的解决方法是使用for循环创建集合,如Barry的回答所示。

答案 2 :(得分:3)

您尝试使用的std::set构造函数将尝试从您传递的范围内构建一个元素:

return set<Artiste*> (m_interpretes.begin(), m_interpretes.end());

但该范围的元素类型是

std::pair<const std::string, Artiste*>

绝对不能转换为Artiste*,这就是为什么你得到关于无法转换的错误。您可以手动执行此操作:

std::set<Artiste*> s;
for (const auto& pair : m_interpretes) {
    s.insert(pair.second);
}