Я разрабатываю абстрактный тип данных, который похож на карту STL для назначения. В записке говорится, что я должен предоставить ряд возможностей, включая вывод объектов, содержащихся в абстрактном типе данных. Как мне поступить с выводом данных массива, хранящихся в ADT, я не могу использовать любой STL, поэтому я предполагаю, что не могу использовать итераторы, и иметь функцию, которая использует cout в ADT, кажется глупым. Какие-либо предложения? Благодарю. Код ниже:
template <typename K, typename D>
class Map
{
private:
int mapSize;
int dataFilled;
struct keyData
{
K key;
D data;
};
keyData* datas;
keyData* ptr;
Если вы идете путем предоставления пользователю доступа к объектам, то я бы пошел с итераторами и operator[]
, Чтобы определить итераторы, вам просто нужно определить begin
а также end
функция-член (с возможным const
Перегрузки). Проблема в том, что вы обычно хотите предложить как ключи, так и значения карты. Путь std::map
решает это, возвращая некоторый тип, который семантически эквивалентен указателю на std::pair<const Key, T>
так что вы можете получить доступ к ключу через std::get<0>(*it)
и значение по std::get<1>(*it)
,
Если вы хотите определить пользовательскую функцию «печати», вы можете просто определить operator<<
за std::ostream
:
template<class Key, class Value>
std::ostream& operator<<(std::ostream& os, const Map<Key, Value>&) { ... }
Таким образом, вы сможете использовать:
Map<Key, Value> map;
std::cout << map;
Я бы рекомендовал предоставить аналогичным образом operator>>
за std::istream
,
Для большего вдохновения вы можете взять посмотри на std::map
интерфейс.