如何在 C++ 中对字符串变量应用计数出现次数的概念

How to apply the concept of counting occurrences on strings variables in C++

以下程序可以计算数组中整数的出现频率 如何将这个概念应用于字符串变量,因为字符串在后端也是一个数组

using namespace std;
int counter[10]={0,0,0,0,0,0,0,0,0,0};
int arr [9][9],x;
int main()
{
    srand(time(NULL));

    cout<<"enter the array  \n";
    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            arr[i][j]=rand()%10;
        }
    }

    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            cout<<arr[i][j]<<" ";
        }
        cout<<endl;
    }


    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            counter[arr[i][j]]++;

        }
    }

    for(int j=0;j<10;j++){
          cout<<j<<" : "<<  counter[j]<<endl;

        }
    return 0;
}

以下是如何从任何事物中计算出任何事物的出现次数:

代码

#include <iterator>
#include <map>
#include <algorithm>

template<class InputIt>
auto
occurrences(InputIt begin, InputIt end)
{
    std::map<typename std::iterator_traits<InputIt>::value_type, std::size_t> result;
    std::for_each(begin, end, [&result](auto const& item){ ++result[item]; });
    return result;
}

用法

#include <string>
#include <iostream>

int main()
{
    auto text = std::string{"Hello, World!"};
    auto occ = occurrences(begin(text), end(text));
    std::cout << occ['l'] << '\n'; // outputs 3
}

Live demo

说明

template<class InputIt>

这是一个遍历任何输入迭代器的通用(模板)函数。

auto

它的 return 类型是从它的实现中推断出来的。剧透警报:它是一个 std::map of (value counter, occurrence of this value).

occurrences(InputIt begin, InputIt end)

occurrences 通过几个定义范围的迭代器调用,通常在您的容器 C.

上调用 begin(C)end(C)
std::for_each(begin, end, //...

对于范围内的每个元素...

[&result](auto const& item){ //...

...执行以下处理...

++result[item]; });

...增加值 item 的出现次数,如果是第一个则从零开始。

这不是一个有效的实现,因为它复制了它计数的值。对于整数、字符、,它是完美的,但对于复杂类型,您可能需要改进此实现。

它与通用和标准容器兼容。你可以计算任何可迭代的东西。

如果我没理解错的话,你想统计字符串的出现次数。 STL 容器映射可用于此目的。以下是示例代码。

#include<iostream> 
#include<map> 
#include<string> 
#include<vector>                   

int main()
{
  std::vector<std::string> arrayString;
  std::map<std::string, int> counter;  
  std::map<std::string, int>::iterator it;

  arrayString.push_back("Hello");
  arrayString.push_back("World");
  arrayString.push_back("Hello");
  arrayString.push_back("Around");
  arrayString.push_back("the");
  arrayString.push_back("World");  

  // Counting logic
  for(std::string strVal : arrayString)
  {        
    it = counter.find(strVal);
    if(it != counter.end())
      it->second += 1; // increment count
    else    
      counter.insert(std::pair<std::string, int>(strVal, 1)); // first occurrence
  }

  // Results
  for(std::map<std::string, int>::iterator it = counter.begin(); it != counter.end(); ++it)  
    std::cout << it->first << ": " << it->second << std::endl;

  return 0;
}

编写计数逻辑的更紧凑的方法是:

  // Counting logic
  for(std::string strVal : arrayString)
  {
    ++counter[strVal]; // first time -> init to 0 and increment
  }