关于区分大小写的c++向量字符串问题

c++ vector string problem about case sensitivity

所以在c++中'A'和'a'是不同的字符,如果我们有一个包含大写字母和小写字母的向量,如何编写一个函数将这个向量转换成一些向量是不区分大小写,例如 'ABba' 与 'abba'.

相同

例如,我想统计字符串中不同字符的个数,例如“ABba”在这种情况下输出必须是2,因为A a是1个相同的组,B和b也相同,这个字符串也可能包含数字,例如。 ABba1212 --> 答案应该是 4.

进行不区分大小写比较的标准方法是:

决定是大写还是小写并将所有字母转换为这种大小写。然后,做你的操作。

在 C++ 中,您有一系列用于该目的的函数。 std::toupperstd::tolower。请签到CPP Reference.

如果你知道你有什么字符集,还有其他的可能性。在西方国家,经常使用 ASCII 字符。在那种情况下,您甚至可以对转换进行位操作。或者,加法或减法。

一些将ASCII字符转换为小写的例子

#include <iostream>
#include <cctype>

int main() {

    char c = 'A';
    c = (char)std::tolower(c);
    std::cout << "\nWith tolower:  " << c << '\n';

    c = 'A';
    if (c >= 'A' and c <= 'Z') c += ('a' - 'A');
    std::cout << "\nWith addition:  " << c << '\n';

    c = 'A';
    if (c >= 'A' and c <= 'Z') c |= 32;
    std::cout << "\nWith bit operation:  " << c << '\n';
}

接下来,统计不同的字符。如果你想计算一个字符串中不同的字符,那么你需要遍历它,并检查你是否看到了这个字符。确实有很多不同的解决方案。

我将向您展示一个非常基本的解决方案,然后是一个 C++ 解决方案。

它是为 8 位字符值制作的。

#include <iostream>
#include <cctype>
#include <string>

int main() {

    std::string test{"ABba1212"};

    // There are 256 different 8 bit char values. Create array and initialize everything to false
    bool weHaveACharValueForThisASCII[256] = {};

    // Iterate over all characters in the source string
    for (char c : test)
        // And mark, if we found a certain char
        weHaveACharValueForThisASCII[std::tolower(c)] = true;

    // Now we want to count, how many different chars we found
    int sum = 0;
    for (bool b : weHaveACharValueForThisASCII) if (b) ++sum;

    // Show result
    std::cout << sum;

    return 0;
}

在 C++ 中,您可以为此使用 std::unordered_set。它只能包含唯一值并使用快速散列进行数据访问。请参阅 here

#include <iostream>
#include <cctype>
#include <string>
#include <unordered_set>

int main() {

    std::string test{"ABba1212"};

    // Here we will store the unique characters
    std::unordered_set<char> unique{};

    // Iterate over all characters in the source string
    for (char c : test) unique.insert((char)std::tolower(c));

    // Show result
    std::cout << unique.size();
}