【问题标题】:Is there a way to count the number of ocurrences of each element of a string array?有没有办法计算字符串数组中每个元素的出现次数?
【发布时间】:2021-12-19 02:54:05
【问题描述】:

我有以下代码完全符合我的要求。问题是我需要样本数组来比较字符串并保持计数。有没有办法在没有样本的情况下计算任何数组上每个字符串的出现次数?

对于更多上下文,最初的问题是从包含车辆信息的.txt 文件中读取数据,例如:

Volkswagen Jetta 
Ford Focus 
Volkswagen Jetta

并统计每个品牌的车辆数量。请记住,这是来自编程入门课程,我们不知道如何使用矢量或地图。

#include <iostream>
#include <string>
using namespace std;
using std::string;
#define MAX 20

int main(){
    int counter[MAX];
    string arr[MAX]={"ABC","AOE","ADC","ABC","ADC","ADC"};
    string sample[MAX]={"ABC", "AOE", "ADC"};
    for(int i=0; i<=MAX; i++){
        counter[i]=0;
    }
    for(int i=0; i<MAX;i++){
        for(int j=0; j<MAX; j++){
            if (sample[i]==arr[j]){
                counter[i]++;
            }
        }
    }

    for(int i=0; i<3;i++){
        cout<< sample[i] << "=" << counter[i]<<endl;
    }
    return 0;
}

【问题讨论】:

  • 尝试使用unordered_map
  • 您是否允许使用std::map
  • 在 C++ 编程入门课程中,vector 是您应该在 string 之后立即学习的内容。 C 样式数组和预处理器#define 应该在高级 C++ 课程中。
  • 很遗憾我们不允许使用地图,我也不知道怎么用,抱歉。
  • 我讨厌不允许学生使用最适合工作的工具来解决问题。

标签: c++ arrays string


【解决方案1】:

如果你想在不知道sample数组初始值的情况下解决这个问题:

创建一个空的sample 数组。当您看到新元素时,将它们添加到此数组中。

使用变量sample_size 来跟踪查看了多少sample。下面是一个不使用std::vector 或动态分配的简单示例。

int main() 
{
    std::string arr[MAX] = { "ABC","AOE","ADC","ABC","ADC","ADC" };
    std::string sample[MAX];
    int sample_size = 0;
    int counter[MAX] = { 0 };
    for (int i = 0; i < MAX; i++)
    {
        if (arr[i].empty()) break;

        bool sample_found = false;
        for (int j = 0; j < sample_size; j++)
            if (arr[i] == sample[j])
            {
                sample_found = true;
                counter[j]++;
                break;
            }

        if (!sample_found)
        {
            sample[sample_size] = arr[i];
            counter[sample_size]++;
            sample_size++;
        }
    }
    for (int i = 0; i < sample_size; i++)
        cout << sample[i] << "=" << counter[i] << std::endl;
    return 0;
}

【讨论】:

    【解决方案2】:

    您所要做的就是保留一个品牌名称列表(一个数组就可以了),以及每个名称的一个计数数组:

    std::string brand_names[100];
    int  counts[100]; // number of times each element of brand_names[] was read from file
    int  num_items = 0;
    

    每次从文件中读取品牌名称时,尝试在字符串数组中查找它。如果找到,只需将同一索引处的计数加一即可。如果没有找到,将其添加到brand_names[]数组的末尾,将1添加到counts[]数组的末尾,并递增num_items

    您只需要一个简单的循环即可:

    • 从文件中读取下一个品牌名称的外循环
    • 尝试在列表中查找品牌名称的内部循环

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 2022-10-15
      • 2016-02-07
      • 1970-01-01
      相关资源
      最近更新 更多