2012-07-07 53 views
1

我有以下代碼實現簡單散列/字典在C++以一個類型作爲參數的函數C++

Hash.h

using namespace std; 

#include <string> 
#include <vector> 

class Hash 
{ 
    private: 
    vector<const char*> key_vector; 
    vector<const char*> value_vector; 
    public: 
    void set_attribute(const char*, const char*); 
    string get_attribute(const char*); 
}; 

Hash.cpp

using namespace std; 

#include "Hash.h" 

void Hash::set_attribute(const char* key, const char* value) 
{ 
    key_vector.push_back(key); 
    value_vector.push_back(value); 
} 

string Hash::get_attribute(const char* key) 
{ 
    for (int i = 0; i < key_vector.size(); i++) 
    { 
     if (key_vector[i] == key) 
     { 
      return value_vector[i]; 
     } 
    } 
} 

目前,它可以作爲一個鍵/值的唯一類型是const char*,但我想擴展它,使它c採取任何類型(顯然每個散列只有一種類型)。我正在考慮通過定義一個以類型作爲參數的構造函數來實現這一點,但在這種情況下我完全不知道如何去做。我該怎麼做,我將如何實現它,所以set_attribute被定義爲採取這種類型?

編譯:單

+8

你有沒有聽說過模板?他們非常有用。 – chris 2012-07-07 23:59:25

+1

'std :: map'或'std :: unordered_map'如何? – bitmask 2012-07-08 01:16:42

+0

這與Mono有什麼關係? – skolima 2012-07-08 12:18:40

回答

2

您需要使用templates做到這一點。 Here就是一個例子。

2
#ifndef HASH_INCLUDED_H 
#define HASH_INCLUDED_H 

#include <string> 
#include <vector> 

template <typename T> 
class Hash 
{ 
    private: 
    std::vector<const T*> key_vector; 
    std::vector<const T*> value_vector; 
    public: 
    void set_attribute(const T*, const T*) 
    { 
     /* you need to add definition in your header file for templates */ 
    } 
    T* get_attribute(const T*) 
    { 
     /* you need to add definition in your header file for templates */ 
    } 
}; 

#endif 

請注意,我已刪除using namespace std;,因爲它完全消除其命名空間的全部要點,尤其是在頭文件。

編輯:另外,是否有任何理由不使用std :: vector的迭代器來遍歷它的項目?

相關問題