如何缩短检查子串存在的多个条件?

时间:2015-07-19 12:32:07

标签: c++ string algorithm performance loops

我有这个正常工作的代码(s这是一个结构变量):

// Convert char array to string
string name(s.name);
string surname(s.surname);
string username(s.username);

// Convert string to lower case
transform(name.begin(), name.end(), name.begin(), ::tolower);
transform(surname.begin(), surname.end(), surname.begin(), ::tolower);
transform(username.begin(), username.end(), username.begin(), ::tolower);

// Check if keyword is a substring inside above string
string::size_type pos = name.find(keyword);
string::size_type pos2 = surname.find(keyword);
string::size_type pos3 = username.find(keyword);
if(pos != string::npos || pos2 != string::npos || pos3 != string::npos) {
    cout << "Found";
}

有人可以给我一些建议如何缩短上面的代码(我已经尝试过循环,但结果是一团糟而且没有运行)。因为我是C ++的新手,所以请耐心等待。

2 个答案:

答案 0 :(得分:0)

您可以尝试以下方式:

bool contains(const S& s, const std::string& keyword)
{
    // Convert char array to string
    std::string names[3] = {s.name, s.surname, s.username};

    for (auto& name : names) {
        // Convert string to lower case
        transform(name.begin(), name.end(), name.begin(), ::tolower);

        // Check if keyword is a substring inside above string
        string::size_type pos = name.find(keyword);
        if(pos != string::npos) {
            std::cout << "Found";
            return true;
        }
    }
    return false;
}

答案 1 :(得分:0)

string name(s.name);
name.push_back('\0'); 
name+=s.surname;
name.push_back('\0');
name+=s.username;

transform(name.begin(), name.end(), name.begin(), ::tolower);
string::size_type pos = name.find(keyword);

if(pos != string::npos ) {
    cout << "Found";
}