В рамках моей C++ HW я должен реализовать общий контейнер Map.
Карта, которую я должен реализовать, должна иметь итератор и константу_тератора. Я решил хранить данные на карте в узле [как в связанном списке].
Мне была предоставлена map_example.cpp, и моя задача - написать map.h, чтобы map_example скомпилировался.
Мой вопрос касается следующих строк кода в файле map_example.cpp
Map<std::string,int> msi;
msi.insert("Alice",5);
msi.insert("Bob",8);
msi.insert("Charlie",0);
// print map
for(Map<std::string,int>::const_iterator it = msi.begin(); it != msi.end(); ++it)
{
std::cout << *it << std::endl;
/*
* prints:
* Alice:5
* Bob:11
* Charlie:0
*/
}
Из этого кода я понимаю, что мне приходится перегружать оператор "*", но я не уверен, что вернуть, чтобы этот цикл мог печатать содержимое карты.
Одна из моих идей - реализовать что-то вроде: 1. iterator :: getKey() 2. iterator :: getData() 3. operator "*" вернет строку, howerve Я не уверен, как создать строку из общего данные.
Каков наилучший способ реализации карты tu для поддержки таких функций?
Просто сделайте что-то похожее на то, что std::map<K, V>
делает, который возвращает std::pair<K const, V>&
или std::pair<K const, V> const&
зависит от того, используется ли iterator
или const_iterator
. Однако std::pair<T0, T1>
не имеет оператора вывода, тогда как тип, который вам нужно вернуть, должен иметь выходной итератор вывода.
Конкретный вопрос, похоже, заключается в том, как вы можете генерировать строку из переменной с общим типом. Это один из возможных ответов; есть еще много.
Вы работали с потоками раньше (cin и cout, например, являются потоками). Возможно, вы заметили, что можете использовать в них различные типы, используя оператор << (ints, strings, what have you). Также очень легко предоставить пользовательские принтеры для таких потоков для ваших собственных типов, предоставляя перегрузку для оператора << для вашего конкретного типа.
Вы можете потребовать, чтобы общие типы для вашей карты должны поддерживать вставку потока через оператор <<. При этом вы можете использовать правильный поток для создания строки (подсказка: в стандартной библиотеке есть такой поток).