读书人

构造一个键、值都可索引的map时遇到的

发布时间: 2012-03-25 20:55:16 作者: rapoo

构造一个键、值都可索引的map时遇到的问题
普通map只能用key索引mapped_value,而我需要同时能用mapped_value索引key的容器,于是开始思考了:

既然要两者都可索引,就必须有两个map了:

C/C++ code
map<key_type, mapped_type> m_mapValue;map<mapped_type, key_type> m_mapKey;


但是这样的话,mapped_value就同时存储了两份,浪费了空间。
于是我考虑把第二个map改成set:

C/C++ code
map<key_type, mapped_type> m_mapValue;set<mapped_type, CmpKey> m_mapKey;


这时问题来了,set在这里需要自定义比较函数CmpKey:给出两个key,能先用key找到mapped_value,然后再比较两个mapped_value。要能用key找到mapped_value,必须让CmpKey能使用m_mapValue,于是我这样写了:

C/C++ code
template<typename _Kty, typename _Pr = less<_Kty>> class CMyMap{// ...class CmpKey    {    public:        CmpKey(const map<key_type, mapped_type> & mapValue) : m_mapValue(mapValue) {}        bool operator()(key_type lhs, key_type rhs) const {return _Pr(m_mapValue[lhs], m_mapValue[rhs]);}    private:        const map<key_type, mapped_type> & m_mapValue;    };// ...map<key_type, mapped_type> m_mapValue;set<mapped_type, CmpKey(m_mapValue)> m_mapKey;};


结果一编译,出错了。因为"CmpKey(m_mapValue)"这里只允许使用静态量,而m_mapValue是每个实例都不同的,所以类无法创建成功。

现在除了自己重新写一个set类,让它可以直接操作m_mapValue,我实在找不到其他更好的方法了。
请问还有更好的办法吗?

[解决办法]
用boost::bimap。

读书人网 >C++

热点推荐