簡體   English   中英

當一對鍵不包含兩個值時,如何將兩個鍵(對)映射到一個鍵?

[英]How to map 2 keys (pair) to one key when the pair might not contain both values?

我想將md5映射到sha1,將sha256映射到sha1。

我考慮使用std::map<pair<string, string>, string>而不是使用2個不同的映射。 插入vlaues時,我會同時擁有md5和sha256,但是我只能向md5查詢示例。 范例:

md5= x;
map.find (x,null)--> return sha1
sha256 =y;
map.find ("" , y) --> return sha1
map(x,y) ----> return sha1

有什么辦法嗎?

鍵之間的某種OR

非常感謝

我曾經為類似的目的創建了一個類,也許可以為您提供幫助。

template<typename T, typename K1, typename K2>
class BiKeyMap
{
public:
    typedef boost::shared_ptr<T> ptr_type;

private:
    std::map<K1, ptr_type > _map1;
    std::map<K2, ptr_type > _map2;
public:

    bool insert(const ptr_type& value, const K1& key1, const K2& key2)
    {
        bool lResult1;
        bool lResult2;
        lResult1= _map1.insert(std::make_pair(key1, value)).second;
        lResult2= _map2.insert(std::make_pair(key2, value)).second;
        return (lResult1&&lResult2);
    }

    ptr_type find1(const K1& key)
    {
        typename std::map<K1, ptr_type>::iterator itr = _map1.find(key);
        if (itr == _map1.end())
            throw ...;
        return itr->second;
    }

    ptr_type find2(const K2& key)
    {
        typename std::map<K2, ptr_type>::iterator itr = _map2.find(key);
        if (itr == _map2.end())
           throw ....
        return itr->second;
    }

};

問題在於在std :: pair之間實現了operator<的方式(在組件之間使用字典順序,因此空字符串將始終是“ first”)。

除了做諸如std::pair<string,string> specialize operator<類的壞事情(這使新行為可用於任何這樣的對,甚至不包含在映射中)之外,您可能還需要一個包含兩個的類作為鍵。字符串,實現operator<以便如果第一個成員中的一個為空,則僅在幾秒鍾內進行比較。

喜歡

struct mykey { std::string fisrt, std::string second; };

bool operator<(const mykey& a, const mykey& b)
{ 
    int ck = (a.first.size() && b.first.size()) + 2*(a.second.size() && b.second.size());
    return (ck==1)? a.first<b.first:
           (ck==2)? a.second<b.second:
           a.first+a.second < b.first+b.second; 
}

並提供像

mykey::mykey(const std::string s1, const std::string& s2) ,這樣您就可以通過為s1或s2提供一個空字符串來創建e“要比較的鍵”,或者通過在兩者中同時賦予值來在地圖中插入值s1和s2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM