Я покажу вам, как использовать стандартную карту для получения количества адресов.
Затем вы можете найти пятерку лучших из них.
Это вытащит некоторые проблемы с дизайном и способами убрать код.
Попробуйте использовать const char *
в конструкторах ваших объектов, а не просто char *
. На самом деле, подумайте, почему вам сказали использовать char *
вместо const char *
- сначала убедитесь, что вы знаете разницу.
Кроме того,
Route **sirR;
sirR = new Route *[5];
sirR = new Route *[5];
sirR[0] = new Route(3);
sirR[1] = new Route(3);
sirR[2] = new Route(2);
sirR[3] = new Route(4);
sirR[4] = new Route(2);
может быть просто
Route sirR[5];
конечное использование
sirR[0].add(" Address 1", 23.43, 21.43, "south", "country1");
вместо
sirR[0]->add(" Address 1", 23.43, 21.43, "south", "country1");
и т. Д. - в нынешнем виде вы не delete
массив, который вы new
изд.
Так как единственный способ получить информацию из массива маршрутов - это распечатать стандартно.
Вам нужно подумать о том, что делает адреса равными.
Классу нужен оператор равенства или другой способ сравнения адресов.
Чтобы использовать std::map
, нам нужно определить оператор меньше чем.
Это поможет вам начать, если вы добавите его внутрь Address
:
bool operator < (const Address & lhs) const
{
return strcmp(desc, lhs.desc) < 0;
}
Он не использует все поля - вы можете подумать, как его расширить.
Если теперь мы добавим заголовок карты
#include <map>
мы можем использовать карту.
Это не лучший или единственный способ сделать это, но он покажет проблемы, с которыми мы пытаемся выяснить адреса.
Ваши адреса указываются в маршрутах, когда вы звоните add
, поэтому мы можем отслеживать их там, если все маршруты видят одну и ту же карту.
class Route
{
static std::map<Address, size_t> frequency; //<- keep track
Address **r;
int dim_max;
int dim_curr;
public:
Route(int = 9);
void print2();
void add(const char *, double, double, const char *, const char*);
virtual ~Route();
int lRoute();
std::map<Address, size_t> frequencies() //<- so we can find use these in main
{
return frequency;
}
protected:
private:
};
std::map<Address, size_t> Route::frequency;//<-- define the static data member
Это обходной путь, когда нельзя запрашивать адреса после того, как они идут по маршруту.
Теперь, используя этот хак, функция add
может заполнить карту:
void Route::add(const char *d, double l, double l2, const char *em, const char *t)
{
r[dim_curr] = new Address(d, Location(l, l2, em), t);
++frequency[*r[dim_curr]]; //count addresses
dim_curr++;
}
Каждый раз, когда вы делаете адрес, он учитывается.
В конце main, перед возвратом 0, вы можете добавить код, чтобы увидеть все значения:
for(auto & items : sirR[0].frequencies())
{
std::cout << items.first << ' ' << items.second << '\n';
}
Для ваших данных все они не нужны.
Для других данных вы могли бы подсчитать несколько лучших.
Я явно не сделал это для вас.
Поскольку ваш код стоит, вы не можете видеть адреса в маршрутах.
Вы можете только распечатать их.
Вам нужно изменить свой код, чтобы иметь к ним доступ.
Если вы избегаете стандартных структур данных и создаете свои собственные в качестве учебного упражнения, вы можете иметь массив имен и соответствующий массив счетчиков и выполнять поиск по именам каждый раз, когда добавляете новый адрес и увеличиваете количество совпадений. .