2015-10-03 72 views
1

爲什麼以下的boost :: char16_t字符串unordered_set

#include <string> 
#include <boost/unordered_set.hpp> 

int main() 
{  
    typedef boost::unordered_set<std::string> unordered_set; 
    unordered_set animals; 

    animals.emplace("cat"); 
    animals.emplace("shark"); 
    animals.emplace("spider"); 
    return 0; 
} 

工作,並按照太多的編譯錯誤結果。

#include <string> 
#include <boost/unordered_set.hpp> 

int main() 
{  
    typedef boost::unordered_set<std::u16string> unordered_set; 
    unordered_set animals; 

    animals.emplace("cat"); 
    animals.emplace("shark"); 
    animals.emplace("spider"); 
    return 0; 
} 

此外,有什麼解決方案呢?我是否需要在函數對象中編寫我自己的hash_functionoperator==here

回答

1

operator==不是一個問題,因爲它已經在標準庫中定義了。 但是,散列函數必須根據標準庫提供的std::u16string專用std::hash進行調整,該工具適用於std::unordered_*容器,但不適用於Boost的容器。

一種解決方案可能是通過以下方式來定義的散列函數:

std::size_t hash_value(std::u16string const &s) { 
    return std::hash<std::u16string>{}(s); 
} 

此包裝將讓你一個已經寫好的邏輯包裹與升壓很好地工作。

最後,讓我提醒您在C++ 11標準庫中等效的std::unordered_set容器的可用性,以防您不瞭解它。

相關問題