C++ arr[s[i]';a';]在这段代码中的用途是什么?为什么我们用';减去所有字符;a';?

C++ arr[s[i]';a';]在这段代码中的用途是什么?为什么我们用';减去所有字符;a';?,c++,C++,有人能解释一下++arr[s[i]-'a'的意思吗下面代码中的逻辑。为什么我们要用“a”减去每个字符 #include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; int main(){ int n; cin >> n; for(i

有人能解释一下
++arr[s[i]-'a'的意思吗下面代码中的逻辑。为什么我们要用“a”减去每个字符

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

int main(){
    int n;
    cin >> n;
    for(int a0 = 0; a0 < n; a0++){
        string s;
        cin >> s;
        int c=0;
        vector <int> arr(26,0);
        for(int i=0;i<s.length();i++){
            ++arr[s[i]-'a'];
        }
        for(int j=0;j<26;j++){
            if(arr[j]!=0)
            c++;
        }
        cout<<c<<endl;
    }
    return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
int n;
cin>>n;
对于(int a0=0;a0>s;
int c=0;
向量arr(26,0);

对于(int i=0;i这是一种将字母从0(表示“a”)转换为25(表示“z”)的相应数值的常用方法。由于“a”等于“a”,因此
'a'-'a'
将为零。由于“b”比“a”大一,因此
'b'-'a'
将为一。依此类推。

您的代码计算字符串中的小写字母。为了仅限制小写字母,将使用-a。这26个字母仅存储在向量中。

它使用一行程序来计算字符串中出现的字母数f一个单词中的一个字母。让我们看看这个分解:

第一个[a[c]-'a']++

  • a[c]-“a”是字母字符的数字表示形式,因此想象一下,如果a[c]是“b”,我们将得到数字1

  • 第一个[a[c]-“a']首先在字母的位置访问数组

  • 第一个[a[c]-'a']++是增加该位置的数字

  • 因此,如果您遇到“b”,您的列表将如下所示:


    “{0,1,0,…”

    你能说得更具体些吗?那代码应该做什么?关于
    -“a”
    你知道ASCII字符表吗?在数值计算中使用字符时,它们是否与ASCII值不符(例如,“a”=97)它们可能是。这取决于平台。你真正得到保证的是
    a
    不会为零,而且
    a
    z
    将是顺序的。
    '0'
    -
    '9'
    是顺序的保证,而
    'a'
    -
    'z'
    'a'
    -
    'z'
    则不是顺序的保证。请参见示例E