Записи в std::map<Key, Value>
должны иметь ключ и значение. Обычный способ их получения и настройки:
my_map[a_key] = new_value; // set
do_something_with(my_map[a_key]); // get and use...
Если вы хотите добавить новые функции, они, вероятно, не будут выглядеть так, как вы предлагаете, потому что:
- вашему
set
присваивается только один параметр, несмотря на необходимость ключа и значения (по общему признанию, вы могли бы принять некоторые соглашения, такие как разделение первых ':' или '=') и
- функция get () не предоставляет никакой клавиши.
Вместо этого вы можете получить что-то более похожее на:
void set(const Key&, const Value&);
std::string get(const Key&) const;
Но даже если у вас есть для этого права на запись, вам не следует добавлять это непосредственно в заголовочный файл карты - все программы на С ++, скомпилированные на этом компьютере, будут совместно использовать этот файл и не будут ожидать его изменения. Любая небольшая ошибка может вызвать проблемы, и если вы отправите свою программу на другой компьютер, вы не сможете скомпилировать ее там, не сделав подобную модификацию - если этот компьютер использует другой компилятор C ++, необходимые детали этой модификации могут немного отличаться тоже.
Таким образом, вы можете написать свой собственный (предпочтительно шаблонный) класс, который наследуется от (наследует) или содержит (композицию) std :: map, предоставляя ваши функции в вашем пользовательском классе. Решение на основе наследования проще и лаконичнее написать:
template <typename Key, typename Value>
struct My_Map : std::map<Key, Value>
{
My_Map(...); // have to provide any non-default constructors you want...
void set(const Key& key, const Value& value) { operator[](key) = value; }
// if you want entries for non-existent keys to be created with a default Value...
Value& get(const Key& key) { return operator[](key); }
--- OR ---
// if you want an exception thrown for non-existent keys...
Value& get(const Key& key) { return at(key); }
const Value& get(const Key& key) const { return at(key); }
};
Это немного опасно, если вы планируете передавать My_Maps по указателю и случайно получить указатель «new My_Map», который позже будет удален как указатель std :: map, как в:
void f(std::map<int, string>* p) { /* use *p */ delete p; }
My_Map<int, string>* p = new My_Map<int, string>;
f(p);
Тем не менее, в большинстве программ нет реальной опасности случайного удаления такой карты, так что продолжайте и сделайте это.
Далее, и именно такое мышление сделает меня непопулярным среди пуристов, боящихся Стандартов, здесь - , потому что My_Map
не добавил ни членов данных, ни других баз , std::map<>
деструктор , вероятно, выполняет все необходимые операции, даже если это технически неопределенное поведение. Я НЕ поощряю вас игнорировать проблему (и сочтет ее непрофессиональной в работе, требующей устойчивости), но вы можете, по крайней мере, немного отдохнуть немного. Мне было бы любопытно услышать от любого с любым компилятором / настройками, где он явно не работает безопасно.
Если вы используете композицию, вам придется написать свои собственные "функции пересылки", чтобы позволить вам использовать My_Map, например, std :: map, для доступа к итераторам, поиска, удаления, вставки и т. Д. Это боль.