【问题标题】:How to make my "own" templated map?如何制作我的“自己的”模板地图?
【发布时间】:2016-01-27 16:18:51
【问题描述】:

我想实现我自己的“简单”容器,该容器将具有地图属性但也保持插入顺序。我听说过 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 的建议并实现了 vector> 并摆脱了转换问题... :)

【问题讨论】:

  • 有什么理由不用标准库提供的容器?
  • @kebs : 是的,我想保持插入顺序,因为我稍后会需要它,但我还必须将某个类与唯一键关联:)
  • 我不确定这是不是最好的方法。您还可以将一些std::pair&lt;Index,Type&gt; 存储在std::vector 中(除非您需要通过密钥访问)。但从一般的角度来看,我认为标准库不适合的情况非常罕见......
  • 这只是我想做的包装 :) 我也想过一个向量> 但我发现(在网上)也许两个向量可能更好,因为我们只有一个向量可以找到正确的索引?
  • @kebs 实际上,在极少数情况下 std::map 和 std::unordered_map 并不酷。这就是性能很重要的地方。像 OP try 这样的平面地图可以赢得 std::(unordered_)map 几倍。

标签: c++ c++11 containers interface-implementation


【解决方案1】:

您无法从 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("测试",1);

【讨论】:

  • 但是在那里,我将通过值而不是引用来传递参数,对吗?这个类也打算存储整个类,所以我试图避免这种情况!
  • 无论如何,vector::push_back() 会复制一份。并且传递的初始值,虽然看起来像是创建了一个副本,但它会被编译器优化掉。
  • 我没有你编辑的编译器错误 :) 我确实忘记 push_back() 做了一个副本,谢谢 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
相关资源
最近更新 更多