在字符串向量中查找字符串不区分大小写的c ++

Fre*_*son 6 c++ string vector case find

我有

std::vector<std::string> vec;
std::string myString; 
Run Code Online (Sandbox Code Playgroud)

我需要找出是否myString是在vec使用不区分大小写 comaprisons.

我知道我可以使用

find(vec.begin(), vec.end(), myString) != vec.end())
Run Code Online (Sandbox Code Playgroud)

回答问题"vec中的myString是什么?" 但这将进行区分大小写的比较.我需要不区分大小写的比较.

这个位置并不重要,我只是想知道myString是否在vec中.

Hum*_*awi 2

您可以使用std::find_if、内联 lambda 和std::tolower进行比较:

//Computing the lower version of mystring
std::string my_string_lower;
my_string_lower.reserve(mystring.size());
std::transform(mystring.begin(), mystring.end(), std::back_inserter(my_string_lower), ::tolower);

// Checking if it is exist in the vector:
auto is_exist = std::find_if(vec.begin(), vec.end(), [&my_string_lower](std::string item){
    //Transform the each vector item to lower temporally 
    std::transform(item.begin(), item.end(), item.begin(), ::tolower);
    return mystring==item;
}) != vec.end();
Run Code Online (Sandbox Code Playgroud)

如果您要在同一字符串向量中搜索多次,最好只计算一次:

//Computing the lower version of the whole vector
std::vector<std::string> vec_lower;
vec_lower.reserve(vec.size());
std::transform(vec.begin(), vec.end(), std::back_inserter(vec_lower),[](std:string item){
    std::transform(item.begin(), item.end(), item.begin(), ::tolower);
    return item;
});

//Computing the lower version of mystring
std::string my_string_lower;
my_string_lower.reserve(mystring.size());
std::transform(mystring.begin(), mystring.end(), std::back_inserter(my_string_lower), ::tolower);

// Checking if it is exist in the lower version of the vector:
auto is_exist = std::find_if(vec_lower.begin(), vec_lower.end(), [&my_string_lower](const std::string& item){
    return mystring==item;
}) != vec_lower.end();
Run Code Online (Sandbox Code Playgroud)

  • `std::tolower` 接受一个 char 而不是 std::string (2认同)