2014-10-17 53 views
-2

我有一些問題想我的地圖轉換成一組 我得到了與該成員數據的「香頌」對象:如何映射轉換成設定

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 ::對< _Ty1,_Ty2>的std ::設置< _Kty> ::刀片(藝人* & &):不可能去convertir樂paramètre1日常量性病::對< _Ty1,_Ty2> EN '藝人* & &' C:\程序文件(x86)\ microsoft visual studio 11.0 \ vc \ include \ set 179 1

任何想法如何解決它?

+2

你爲什麼要在容器中存儲指針?這看起來像是一個等待發生的內存泄漏。 – Mgetz 2014-10-17 12:55:38

+1

第二個問題:爲什麼使用動態異常規範?它們會導致各種奇怪的事情發生,並放慢你的代碼,目前的一般建議是完全避免它們。 – Mgetz 2014-10-17 13:02:44

+0

事實上,在最新的標準中,動態異常規範已被棄用。 – user2079303 2014-10-17 13:04:33

回答

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); 
} 
+0

工作正常。非常感謝! – Nico 2014-10-17 13:05:42

1

一個映射是一個關聯數據結構,而一個集合只包含項目的無序集合,所以添加一對(key,value)對後者無效,並且只適用於前者。

爲了使按鍵的setmap,你可以做

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; 
+0

我覺得有問題:return set (m_interpretes.begin(),m_interpretes.end()); ,好像我可以通過地圖添加對象而沒有任何問題 – Nico 2014-10-17 12:56:51

+0

錯誤字符串似乎與調用'insert'有關。 – legends2k 2014-10-17 12:58:50

+0

m_interpretes.insert(a)不正確,直到我的地圖對象聲明是std :: map m_interpretes; – Nico 2014-10-17 13:00:37

3

的問題是在這裏:

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

如果你看看你從map::begin()得到的種類和map::end()函數你看到你得到std::pair<string, Artiste*>的迭代器。

問題是set::insert()函數期望它給出的迭代器的類型爲Artiste*

最簡單的解決方法是使用for循環創建集合,如Barry的答案所示。