关于区分大小写的c++向量字符串问题
c++ vector string problem about case sensitivity
所以在c++中'A'和'a'是不同的字符,如果我们有一个包含大写字母和小写字母的向量,如何编写一个函数将这个向量转换成一些向量是不区分大小写,例如 'ABba' 与 'abba'.
相同
例如,我想统计字符串中不同字符的个数,例如“ABba”在这种情况下输出必须是2,因为A a是1个相同的组,B和b也相同,这个字符串也可能包含数字,例如。 ABba1212 --> 答案应该是 4.
进行不区分大小写比较的标准方法是:
决定是大写还是小写并将所有字母转换为这种大小写。然后,做你的操作。
在 C++ 中,您有一系列用于该目的的函数。 std::toupper
和std::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();
}
所以在c++中'A'和'a'是不同的字符,如果我们有一个包含大写字母和小写字母的向量,如何编写一个函数将这个向量转换成一些向量是不区分大小写,例如 'ABba' 与 'abba'.
相同例如,我想统计字符串中不同字符的个数,例如“ABba”在这种情况下输出必须是2,因为A a是1个相同的组,B和b也相同,这个字符串也可能包含数字,例如。 ABba1212 --> 答案应该是 4.
进行不区分大小写比较的标准方法是:
决定是大写还是小写并将所有字母转换为这种大小写。然后,做你的操作。
在 C++ 中,您有一系列用于该目的的函数。 std::toupper
和std::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();
}