如何制作我的 "own" 模板化地图?
How to make my "own" templated map?
我想实现我自己的 "simple" 容器,它具有地图属性,但也保持插入顺序。我听说过 boost::multi_index 但我发现很难理解我想要的东西。
所以我做了一个模板class:
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 而不是字符串。这让我发疯,我找不到任何答案(或任何词来正确描述我的问题以研究答案)。我想这与分配器有关,但我无法理解如何修复它。
我怎样才能让我的地图进行这种转换,同时又保持通用,因为我需要它与其他(自己实现的)classes 一起使用?
编辑: 解决了 "string" 问题后,我在传递 int 时遇到了问题,因为它正在等待 &int。遵循 kebs 的建议并实施了 vector> 并摆脱了转换问题...:)
您不能从 const char*
构建引用(即使它被强制转换为字符串),请试试这个:
template<typename KEY, typename VALUE>
void insert(KEY key, VALUE val) {
m_keys.push_back(key);
m_values.push_back(val);
}
更准确地说,编译器很清楚这个问题:
error: invalid initialization of non-const reference of type 'std::basic_string&' from an rvalue of type 'std::basic_string'
m.insert("test",1);
我想实现我自己的 "simple" 容器,它具有地图属性,但也保持插入顺序。我听说过 boost::multi_index 但我发现很难理解我想要的东西。
所以我做了一个模板class:
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 而不是字符串。这让我发疯,我找不到任何答案(或任何词来正确描述我的问题以研究答案)。我想这与分配器有关,但我无法理解如何修复它。 我怎样才能让我的地图进行这种转换,同时又保持通用,因为我需要它与其他(自己实现的)classes 一起使用?
编辑: 解决了 "string" 问题后,我在传递 int 时遇到了问题,因为它正在等待 &int。遵循 kebs 的建议并实施了 vector> 并摆脱了转换问题...:)
您不能从 const char*
构建引用(即使它被强制转换为字符串),请试试这个:
template<typename KEY, typename VALUE>
void insert(KEY key, VALUE val) {
m_keys.push_back(key);
m_values.push_back(val);
}
更准确地说,编译器很清楚这个问题:
error: invalid initialization of non-const reference of type 'std::basic_string&' from an rvalue of type 'std::basic_string' m.insert("test",1);