如何在 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
}
说明
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
}
以下程序可以计算数组中整数的出现频率 如何将这个概念应用于字符串变量,因为字符串在后端也是一个数组
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
}
说明
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
}