当两个键(对)可能不包含两个值时,如何将两个键映射到一个键

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

本文关键字:两个 映射 一个 包含两      更新时间:2023-10-16

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

我想用std::map<pair<string, string>, string>代替使用2个不同的地图。当插入值时,我将同时使用md5和sha256,但我只能使用md5进行查询。例子:

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

有什么办法吗?

键之间的某种OR

Thanks to lot

我曾经为类似的目的创建了一个类,也许它可以帮助你。

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;
    }
};

问题在于operator<在std::pair之间实现的方式(在组件之间使用字典顺序,因此空字符串将始终是"first")。

除了做一些不好的事情,比如为std::pair<string,string>专门化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一个空字符串来创建一个"键来比较",或者通过给s1和s2来在映射中插入值。