Я хочу реализовать свой собственный «простой» контейнер, который будет иметь свойства карты, но также будет сохранять порядок вставки. Я слышал о 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, а не в строку. Это сводит меня с ума, и я не могу найти никакого ответа (или любое слово, чтобы правильно описать мою проблему, чтобы найти ответ). Я думаю, это как-то связано с распределителями, но я не могу понять, как это исправить.
Как я могу сделать так, чтобы моя карта выполняла это преобразование, но при этом оставалась общей, так как она понадобится другим классам (реализованным самостоятельно)?
РЕДАКТИРОВАТЬ : После решения проблемы «string» у меня возникли проблемы при передаче int, потому что он ожидал &внутр. Следовал советам кебов и реализовал вектор> вместо этого и избавился от проблем с конвертацией … 🙂
Вы не можете создать ссылку из 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);
Других решений пока нет …