2016-04-12 18 views
1

Yapmaya çalıştığım şey, birincil kullanarak anagram için karma oluşturmak; Ancak, == işleci nedeniyle ekstra bir struct key oluşturmak zorunda olmak biraz rahatsız edici. Var olan == std :: string'ini aşırı yüklemek için bir çözüm var mı?Hasar için std :: string 'in üzerine yazmak gerekir?

#include <string> 
#include <unordered_map> 
#include <cstddef> 
#include <iostream> 


using namespace std; 

int F[26] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 
      31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 
      73, 79, 83, 89, 97, 101}; 

size_t f(const string &s) { 
    size_t r = 1; 
    for (auto c : s) { 
    r *= F[c - 'a'] % 9999997; 
    } 
    return r; 
} 

// this struct seemed redundant! 
struct key { 
    const string s; 

    key(const string s) 
    :s(s) {} 

    bool operator ==(const key &k) const { 
    return f(s) == f(k.s); 
    } 
}; 

struct hasher { 
    size_t operator()(const key &k) const { 
    return f(k.s); 
    } 
}; 

int main() { 
    unordered_map<key, int, hasher> cnt; 
    cnt[key{"ab"}]++; 
    cnt[key{"ba"}]++; 
    cout << cnt[key{"ab"}] << endl; 
} 
+0

Kalıtım kullanın – tomascapek

+1

@RainbowTom: Don't; std :: string' bir temel sınıf olarak değil, bir değer sınıfı olarak tasarlandı. C++ ** ** 'int' den miras almanızı engeller ve ** sizi std :: string 'den miras almanızı engeller. – MSalters

+0

@MSalters Her gün daha akıllı, teşekkürler! – tomascapek

cevap

7

unordered_map ilan olduğunu yeni sınıf için aşırı yük operatörü eklemek dördüncü şablon parametresi olarak belirtin.

+0

kullanılır. Tamamen bundan habersiz :). – Chan

+0

İçindekiler listesinde 'ı gördüm ve daha fazla okumadım. > _ < – bipll

+0

@bipll Sorgudakileri temizledim. – juanchopanza

-3

Kendi sınıf std :: string türetilmiş oluşturun ve

template< 
    class Key, 
    class T, 
    class Hash = std::hash<Key>, 
    class KeyEqual = std::equal_to<Key>, 
    class Allocator = std::allocator<std::pair<const Key, T>> 
> class unordered_map; 

Böylece kendi eşitliğini yerini alabilir olarak

+2

Bu tehlikeli; temel sınıfın sanal işlevleri yoktur, bu yüzden eğer std :: string 'kabul eden herhangi bir arabirime aktarırsanız, yanlış eşitlik –

İlgili konular