首页 > 解决方案 > 有没有办法计算字符串数组中每个元素的出现次数?

问题描述

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

对于更多的上下文,最初的问题是从.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;
}

标签: c++arraysstring

解决方案


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

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

使用变量sample_size来跟踪sample已经看到了多少 s。下面是一个不使用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;
}

推荐阅读