我想将md5映射到sha1,将sha256映射到sha1。
我没有使用2个不同的地图,而是考虑使用std::map<pair<string, string>, string>
。
插入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
..
非常感谢
答案 0 :(得分:0)
我曾经为类似的追求创造了一个类,也许它可以帮到你。
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;
}
};
答案 1 :(得分:0)
问题在于std :: pair之间实现operator<
的方式(使用组件之间的字典顺序,因此空字符串将始终为“first”)。
除了为operator<
做专门的std::pair<string,string>
之外的事情(这使得新行为可用于任何这样的对甚至不参与地图),你可能需要作为一个关键类持有两个字符串,实现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;
}
并提供像
这样的ctor mykey::mykey(const std::string s1, const std::string& s2)
,这样你就可以通过给s1或s2一个空字符串创建e“要比较的键”,或者通过同时给出s1和s2来修改地图中的值。