【问题标题】:how to convert map into set如何将地图转换为集合
【发布时间】:2014-10-17 12:53:01
【问题描述】:

我在尝试将我的地图转换为集合时遇到了一些问题 我得到了一个带有这个成员数据的“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<_ty1> std::set<_kty>::insert(Artiste *&&) : 不可能 de convertir le paramètre 1 de const std::pair<_ty1> en 'Artiste *&&' c:\program files (x86)\microsoft visual studio 11.0\vc\include\set 179 1

知道怎么解决吗?

【问题讨论】:

  • 为什么要将指针存储在容器中?这似乎是等待发生的内存泄漏。
  • 第二个问题:为什么要使用动态异常规范?它们会导致各种奇怪的事情发生并减慢您的代码速度,目前的一般建议是完全避免它们。
  • 其实在最新的标准中,动态异常规范已经被弃用了。
  • @user2079303:实际上,它们在以前的标准中已被弃用!
  • @LightnessRacesinOrbit 好吧,它们仍然仍然被弃用,除非我错过了什么。

标签: c++ map set


【解决方案1】:

map是一种关联数据结构,而set只包含无序的item集合,所以添加pair (key, value)对后者无效,只对前者成立。

要从map 中创建一个set 的密钥,您可以这样做

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;

【讨论】:

  • 我觉得有问题:return set (m_interpretes.begin(), m_interpretes.end()); ,好像我可以毫无问题地通过地图添加对象
  • 错误字符串似乎与对insert的调用有关。
  • m_interpretes.insert(a) 也不正确,直到我的地图对象声明为 std::map<:string> m_interpretes;
  • 但是你的错误说你已经把它改成了std::set,不是吗? std::set&lt;_Kty&gt;::insert(Artiste *&amp;&amp;) .
  • 不,我只希望我的函数“set Chanson::getArtistes() const{}”返回一个集合而不是地图。
【解决方案2】:

您尝试使用的 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);
}

【讨论】:

    【解决方案3】:

    问题出在这里:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 2017-12-24
      • 2021-10-28
      • 2018-01-26
      • 1970-01-01
      相关资源
      最近更新 更多