如何制作我的"own"模板化地图?

How to make my "own" templated map?

本文关键字:地图 own 何制作 我的      更新时间:2023-10-16

我想实现我自己的"简单"容器,它将具有map属性,但也保持广告顺序。我听说过 boost::multi_index,但我发现很难理解我想要什么。

所以我做了一个模板化类:

template<typename KEY, typename VALUE>
class MyMap {
    private : 
        std::vector<KEY>    m_keys;
        std::vector<VALUE>  m_values;
    public :
        void insert(KEY& key, VALUE& val) {
            //Test if key exists //
            m_keys.push_back(key);
            m_values.push_back(val);
        }
        /* Other methods like erase/size/operator[]/begin/etc. */
};

只是为了测试它,我想做这样的事情:

int main() {
    MyMap<string,int> m;
    m.insert("test",1);
    m.insert("cat",2);
    for(auto& item : m) {
        cout << item << endl;
        cout << m[item] << endl;
    }
}

但是我在插入(和 [ ])上不断收到编译错误,因为它将我的 KEY 转换为basic_string而不是字符串。这让我发疯,我找不到任何答案(或任何词来正确描述我的问题以研究答案)。我想这与分配器有关,但我无法理解如何解决它。如何让我的地图进行这种转换,但也保持通用,因为我需要它与其他(自己实现的)类一起使用?

编辑:解决"字符串"问题后,我在传递 int 时遇到了问题,因为它正在等待 &int.遵循 kebs 建议并实现了一个向量>而是摆脱了转换问题...... :)

您无法从const char*构建引用(即使它被强制转换为字符串),请尝试以下操作:

    template<typename KEY, typename VALUE>
    void insert(KEY key, VALUE val) {
        m_keys.push_back(key);
        m_values.push_back(val);
    }

更准确地说,编译器对这个问题非常清楚:

错误:从类型为"std::basic_string"的右值初始化类型为"std::basic_string&"的非常量引用无效 m.insert("test",1);