我想实现自己的"简单"容器,它将具有地图属性,但也保持插入顺序。我听说过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而不是字符串。它让我发疯,我无法找到任何答案(或任何一个词来正确描述我的问题以研究答案)。我想这与分配器有关,但我无法理解如何解决它。 如何使我的地图进行此转换,但也保持一般性,因为我需要与其他(自己实现的)类一起使用?
编辑:解决&#34;字符串&#34;问题,我在传递int时遇到了问题,因为它正在等待&amp; int。遵循kebs建议并实施了一个矢量&gt;相反,摆脱了转换问题... :)
答案 0 :(得分:0)
您无法从const char*
构建引用(即使它被转换为字符串),请尝试这样做:
template<typename KEY, typename VALUE>
void insert(KEY key, VALUE val) {
m_keys.push_back(key);
m_values.push_back(val);
}
更确切地说,编译器非常清楚这个问题:
错误:类型&#39; std :: basic_string&amp;&#39;的非const引用的初始化无效来自类型&#39; std :: basic_string&#39;的左值 m.insert(&#34;测试&#34;,1);