#include <iostream>
#include <string>
#include <map>
#include <optional>
#include <vector>
#include <algorithm>
#include <numeric>
#include <cmath>
struct UserProfile {
int age;
std::string country;
bool subscribed;
};
class UserManager {
public:
bool add_user(const std::string& user_id, int age, const std::string& country, bool subscribed) {
if (users.find(user_id) != users.end()) {
return false;
}
users[user_id] = UserProfile{age, country, subscribed};
return true;
}
std::optional<UserProfile> get_user(const std::string& user_id) {
if (users.find(user_id) != users.end()) {
return users[user_id];
}
return std::nullopt;
}
bool update_user(const std::string& user_id, std::optional<int> age, std::optional<std::string> country, std::optional<bool> subscribed) {
if (users.find(user_id) == users.end()) {
return false;
}
if (age) {
users[user_id].age = age.value();
}
if (country) {
users[user_id].country = country.value();
}
if (subscribed) {
users[user_id].subscribed = subscribed.value();
}
return true;
}
std::vector<std::string> filter_users(std::optional<int> min_age, std::optional<int> max_age, std::optional<std::string> country, std::optional<bool> subscribed) {
std::vector<std::string> filtered_users;
for (const auto& [user_id, profile] : users) {
if (min_age && profile.age < min_age) {
continue;
}
if (max_age && profile.age > max_age) {
continue;
}
if (country && profile.country != country) {
continue;
}
if (subscribed && profile.subscribed != subscribed) {
continue;
}
filtered_users.push_back(user_id);
}
return filtered_users;
}
std::map<std::string, float> aggregate_stats() {
float total_users = static_cast<float>(users.size());
if (total_users == 0) {
return {{"total_users", 0.0f}, {"average_age", 0.0f}, {"subscribed_ratio", 0.00f}};
}
float total_age = std::accumulate(users.begin(), users.end(), 0.0f, [](float sum, const auto& pair) {
return sum + pair.second.age;
});
float subscribed_users = static_cast<float>(std::count_if(users.begin(), users.end(), [](const auto& pair) {
return pair.second.subscribed;
}));
float average_age = std::floor(total_age / total_users);
float subscribed_ratio = std::round((subscribed_users / total_users) * 100) / 100;
return {{"total_users", total_users}, {"average_age", average_age}, {"subscribed_ratio", subscribed_ratio}};
}
private:
std::map<std::string, UserProfile> users;
};
// Example usage
int main() {
UserManager um;
um.add_user("u1", 25, "USA", true);
um.add_user("u2", 30, "Canada", false);
um.add_user("u3", 22, "USA", true);
auto result1 = um.filter_users(20, 30, "USA", true);
for (const auto& user_id : result1) {
std::cout << user_id << " "; // u1 u3
}
std::cout << std::endl;
auto result2 = um.filter_users(std::nullopt, 28, std::nullopt, std::nullopt);
for (const auto& user_id : result2) {
std::cout << user_id << " "; // u1 u3
}
std::cout << std::endl;
auto result3 = um.filter_users(std::nullopt, std::nullopt, "Canada", false);
for (const auto& user_id : result3) {
std::cout << user_id << " "; // u2
}
std::cout << std::endl;
auto stats = um.aggregate_stats();
std::cout << "Total users: " << stats["total_users"] << std::endl; // 3
std::cout << "Average age: " << stats["average_age"] << std::endl; // 25
std::cout << "Subscribed ratio: " << stats["subscribed_ratio"] << std::endl; // 0.67
return 0;
}