Я разрабатываю абстрактный тип данных, который похож на карту 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
member (с возможными перегрузками 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
.
Key
и Value
.
std::cout
илиstd::ostream
?