C/C++

[C++] Задача на структуры

Имеется информация о населении городов в формате (город, год, количество жителей).
Организовать ввод и хранение массива данных, обработку массива данных с целью определить:
а) суммарное количество жителей в представленных городах
б) максимальное количество жителей в городе
в) город с наибольшим, наименьшим населением
г) город, в котором население увеличилось больше всего за последний год
(в решении желательно применить структуры)
#include <algorithm>
#include <iostream>
#include <string>
#include <cstdlib>
#include <limits>
#include <map>
#include <vector>

void clear(std::istream& inp = std::cin) {
inp.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

template<typename T>
T number(const char* msg = ">>> ", std::istream& inp = std::cin) {
T value{};
std::cout << msg;
inp >> value;
clear();
return value;
}

using namespace std;

struct City {
string title;
map<unsigned short, int, greater<unsigned short>> box;
City() = default;
City(const string& title) : title(title) {}
void insert(const unsigned short year, const int population) {
box[year] = population;
}
friend bool operator==(const City& a, const City& b) {
return a.title == b.title;
}
};

class Cities {
public:
void add(const string& title, const unsigned short year, const int population) {
auto pos = find(cities.begin(), cities.end(), title);
if (pos == cities.end()) {
City city{ title };
city.box.insert({ year, population });
cities.push_back(city);
} else {
pos->box.insert({ year, population });
}
}
int total()const {
auto acc = 0;
for (const auto& item : cities) acc += item.box.cbegin()->second;
return acc;
}
string max()const {
auto cmp = [](const City& a, const City& b) {
return a.box.cbegin()->second < b.box.cbegin()->second;
};
return max_element(cities.cbegin(), cities.cend(), cmp)->title;
}
string min()const {
auto cmp = [](const City& a, const City& b) {
return a.box.cbegin()->second < b.box.cbegin()->second;
};
return min_element(cities.cbegin(), cities.cend(), cmp)->title;
}
int max_population(const string& title)const {
using box_t = pair<unsigned short, int>;
const auto pos = find(cities.cbegin(), cities.cend(), title);
if (pos != cities.end()) {
auto cmp = [](const box_t& a, const box_t& b) {
return a.second < b.second;
};
auto max = max_element(pos->box.cbegin(), pos->box.cend(), cmp);
return max->second;
} else {
return -1;
}
}
string max_difference()const {
auto difference = 0;
string target;
for (const auto& [title, item] : cities) {
if (item.size() > 1) {
auto curr = item.cbegin()->second;
const auto year = static_cast<unsigned short>(item.cbegin()->first - 1);
if (item.contains(year)) {
auto next = item.at(year);
auto diff = curr - next;
if (difference < curr - next) {
difference = diff;
target = title;
}
}
}
}
return target;
}
private:
vector<City> cities;
};

int main() {
system("chcp 1251 > nul");

Cities cities;
cities.add("Москва", 2020, 11632512);
cities.add("Минск", 2020, 2085741);
cities.add("Воронеж", 2020, 1005874);
cities.add("Москва", 2019, 10825432);
cities.add("Минск", 2019, 1998301);
cities.add("Воронеж", 2019, 954786);

cout << "Введите название города: ";
string title;
getline(cin, title);
auto max_population = cities.max_population(title);
auto total = cities.total();
auto min = cities.min();
auto max = cities.max();
auto max_difference = cities.max_difference();
cout
<< "Cуммарное количество жителей в представленных городах: " << total << '\n'
<< "Город с наибольшим населением: " << min << '\n'
<< "Город с наименьшим населением: " << max << '\n'
<< "Город, в котором население увеличилось больше всего за последний год: " << max_difference << '\n';
if (max_population != -1) cout << "Максимальное количество жителей в городе " << title << ": " << max_population << '\n';
else cout << "Город " << title << " не найден! \n";
system("pause > nul");
}
Дима Брайко
Дима Брайко
71 252
Лучший ответ