C++实现:统计唯一客户数量并输出客户累计消费金额
嘿,这个需求其实用C++里的关联容器就能轻松搞定,我给你捋清楚步骤和代码示例:
核心思路
我们可以用std::map或者std::unordered_map来存储客户姓名和累计消费金额——这两个容器会自动帮我们处理重复的客户姓名,不需要手动去重:
std::map会按姓名的字典序排序存储,适合需要有序输出的场景std::unordered_map是哈希实现,插入和查找的效率更高,适合数据量较大的情况
具体步骤很简单:
- 遍历两个数组的对应元素,把每个客户的消费金额累加到容器中对应的键值上
- 遍历容器,就能直接得到唯一客户数量(容器的
size()方法)和每位客户的累计消费
完整代码示例
#include <iostream> #include <vector> #include <unordered_map> // 如果想用有序的map,替换成#include <map>即可 int main() { // 示例输入数组 std::vector<std::string> customerNames = {"peter", "mary", "peter", "may", "edward", "edward"}; std::vector<int> amounts = {300, 400, 500, 300, 400, 500}; // 用unordered_map存储累计消费,键是客户姓名,值是累计金额 std::unordered_map<std::string, int> customerTotal; // 遍历数组,累加消费金额 for (size_t i = 0; i < customerNames.size(); ++i) { // 如果客户不存在,会自动插入默认值0,然后加上当前金额;如果存在则直接累加 customerTotal[customerNames[i]] += amounts[i]; } // 输出唯一客户数量 std::cout << "唯一客户数量:" << customerTotal.size() << std::endl; std::cout << "------------------------" << std::endl; // 输出每位客户的累计消费 for (const auto& pair : customerTotal) { std::cout << "客户 " << pair.first << " 的累计消费金额:" << pair.second << std::endl; } return 0; }
代码说明
- 我们用
std::vector来存储输入的姓名和金额数组,也可以用普通数组,不过vector更灵活 - 遍历的时候用
size_t作为循环变量,避免数组越界的类型警告 - 当我们访问
customerTotal[customerNames[i]]时,如果这个客户还没在map里,容器会自动创建一个键值对,值初始化为0,然后加上当前的消费金额;如果已经存在,就直接累加
如果需要按姓名排序输出,只需要把std::unordered_map替换成std::map就行,其他代码不需要改动。
内容的提问来源于stack exchange,提问作者cosmozv




