尝试使用:
来比较字符串!(stringvector[i]).compare(vector[j][k])
仅适用于
的某些条目vector[j][k]
- 是一个敏感的字符串匹配的
。
我如何从此功能中获得对案例不敏感的匹配?
这是我正在从事的一些代码
#include <iostream>
#include <vector>
#include <string>
using namespace std; //poor form
vector<string> stringvector = {"Yo", "YO", "babbybabby"};
vector<string> vec1 = {"yo", "Yo" , "these"};
vector<string> vec2 = {"these", "checked" , "too" , "Yo", "babbybabby"};
vector<vector<string>> vvs = {vec1, vec2};
for (int v = 0; v < vvs.size(); v++) //first index of vector
{
for(int s = 0; s < vvs[v].size(); s++) //second index of vector
{
for(int w = 0; w < stringvector.size(); w++)
{
if (stringvector[w] == vvs[v][s])
{cout << "******FOUND******";}
}
}
}
这没有打印出针对情况不敏感的匹配。
stringvector [w] == vvs [v] [s]不能对情况不敏感,有没有办法可以轻松添加此功能?
- 教授D
tl; dr
使用ICU库。
"简单的方式",当涉及自然语言字符串时,通常充满了问题。
正如我在答案中指出的"小写转换"答案@armando链接到的答案,如果您想实际执行此操作 right ,您目前最好使用ICU库,因为此时,标准中没有任何东西可以为您提供实际 Unicode支持。
如果您查看@NutCracker使用的std::tolower
的文档,您会发现...
只能通过此功能执行1:1字符映射,例如希腊大写字母"σ"具有两个小写形式,具体取决于一个单词的位置:'σ'和'ς。在这种情况下,无法使用对STD :: Tolower的呼叫来获取正确的小写形式。
如果您想正确执行此操作,,您需要完整的Unicode支持,这意味着ICU库,直到C 标准的后来进行了一些修订,实际上将其介绍给该库标准库。
使用 icu::UnicodeString
-起初可能笨拙 - 存储您的语言字符串使您可以访问caseCompare()
,它可以进行适当的 case-case-dimentimentiment。
您可以为此目的实现一个函数,例如:
bool areEqualsCI(const string &x1, const string &x2){
if(x1.size() != x2.size()) return false;
for(unsigned int i=0; i<x2.size(); ++i)
if(tolower((unsigned char)x1[i]) != tolower((unsigned char)x2[i])) return false;
return true;
}
我建议您查看这篇文章如何将std ::字符串转换为较低的情况?
首先,我给了自己一些自由,可以稍微提高您的代码。为此,我用基于范围的循环代替了普通的循环。此外,我更改了您的变量名称。尽管我不知道代码的目的是什么,但它们还不是完美。但是,这是一个重构的代码:
#include <iostream>
#include <vector>
#include <string>
int main() {
std::vector<std::string> vec1 = { "Yo", "YO", "babbybabby" };
std::vector<std::string> vec2 = { "yo", "Yo" , "these" };
std::vector<std::string> vec3 = { "these", "checked", "too", "Yo", "babbybabby" };
std::vector<std::vector<std::string>> vec2_vec3 = { vec2, vec3 };
for (auto const& i : vec2_vec3) {
for (auto const& j : i) {
for (auto const& k : vec1) {
if (k == j) {
std::cout << k << " == " << j << std::endl;
}
}
}
}
return 0;
}
现在,如果要在情况下比较字符串,并且如果您可以访问Boost库,则可以以以下方式使用boost::iequals
:
#include <boost/algorithm/string.hpp>
std::string str1 = "yo";
std::string str2 = "YO";
if (boost::iequals(str1, str2)) {
// identical strings
}
另一方面,如果您无法访问Boost库,则可以使用STL算法(需要C 14)来制作自己的iequals
功能:
bool iequals(const string& a, const string& b) {
return std::equal(str1.begin(), str1.end(),
str2.begin(), str2.end(),
[](char a, char b) {
return std::tolower(a, std::locale()) == std::tolower(b, std::locale());
});
}
std::string str1 = "yo";
std::string str2 = "YO";
if (iequals(str1, str2)) {
// identical strings
}
请注意,这仅适用于单字节字符集(SBC)。