2012-05-01 24 views
9

背景:我從Java世界來到,而我對C++或Qt相當陌生。C++ unordered_map與矢量作爲鍵一起使用時失敗

爲了與unordered_map玩,我已經寫了下面的程序:

#include <QtCore/QCoreApplication> 
#include <QtCore> 
#include <iostream> 
#include <stdio.h> 
#include <string> 
#include <unordered_map> 

using std::string; 
using std::cout; 
using std::endl; 
typedef std::vector<float> floatVector; 

int main(int argc, char *argv[]) { 
    QCoreApplication a(argc, argv); 

    floatVector c(10); 
    floatVector b(10); 

    for (int i = 0; i < 10; i++) { 
     c[i] = i + 1; 
     b[i] = i * 2; 
    } 

    std::unordered_map<floatVector, int> map; 

    map[b] = 135; 
    map[c] = 40; 
    map[c] = 32; 

    std::cout << "b -> " << map[b] << std::endl; 
    std::cout << "c -> " << map[c] << std::endl; 
    std::cout << "Contains? -> " << map.size() << std::endl; 

    return a.exec(); 
} 

不幸的是,我遇到了如下因素的錯誤是不令人振奮。甚至沒有行號。

:-1: error: collect2: ld returned 1 exit status

任何想法的問題來源?

在此先感謝。

+1

你需要一個散列函數,它需要一個'vector ' –

+2

這不是運行時失敗。 –

+0

@SethCarnegie這就是我雖然也遇到了問題。但是,在我看來,像vector這樣基本的類應該有一個默認的散列函數。如果情況並非如此,你能否向我解釋如何提供或向我提供某些材料。謝謝! –

回答

21

§23.2.5,第3款,說:

Each unordered associative container is parameterized by Key , by a function object type Hash that meets the Hash requirements (17.6.3.4) and acts as a hash function for argument values of type Key , and by a binary predicate Pred that induces an equivalence relation on values of type Key .

使用vector<float>Key,而不是提供明確的哈希和等價的謂詞類型意味着默認std::hash<vector<float>>std::equal_to<vector<float>>將被使用。

等效關係的std::equal_to是好的,因爲有一個運營商==矢量,這就是std::equal_to使用什麼。

然而,沒有std::hash<vector<float>>專業化,這可能是你沒有告訴我們的鏈接器錯誤說。你需要提供你自己的哈希器才能工作。

寫這樣的散列器的一個簡單的方法是使用boost::hash_range

template <typename Container> // we can make this generic for any container [1] 
struct container_hash { 
    std::size_t operator()(Container const& c) const { 
     return boost::hash_range(c.begin(), c.end()); 
    } 
}; 

然後你可以使用:

std::unordered_map<floatVector, int, container_hash<floaVector>> map; 

當然,如果你在你需要的地圖需要不同的平等語義適當地定義哈希和等價關係。


1。然而,這避免對散列無序容器,不同的次序會產生不同的散列,並且在無序容器的順序不被保證。

+1

非常感謝你的確解決了我的問題。 請注意人們會有相同的問題: 使用boost :: hash_range你需要#include

+0

@ user1162647:這實際上是該文檔頁面上的第一件事。 ; - ] – ildjarn

+0

@R。Martinho Fernandes:如果你還在觀看,該頁面上的文檔會說:「hash_range對元素的順序非常敏感,所以不適合在無序容器中使用它。」這是否表明上述用法是錯誤的? – ForeverLearning

相關問題