我可以使用一个变量来多次搜索std::string,而不是使用不同的size_t变量吗?

Instead of having different size_t variables, can I use just one for searching a std::string multiple times?

本文关键字:变量 size std 可以使 一个 我可以 搜索 string      更新时间:2023-10-16

我想知道是否有可能减少我在这里使用的多少size_t变量。以下是我的文件:

std::size_t found, found2, found3, found4 /* etc */;

每个都有自己的字符串要查找:

found1 = msg.find("string1");
found2 = msg.find("string2");
found3 = msg.find("string3");
found4 = msg.find("string4");
// etc

如果找到该单词,它将丢弃并阻止消息显示:

if (found1 != std::string::npos)
{
    SendMsg("You cannot say that word!");
}

我有else if语句直到found21。我想把所有东西都缩小,这样就干净了,但我不知道该怎么做。我还想把这个单词小写。我也从来没用过鲜花,所以如果有人能帮帮我,我会很感激的。

要小写字符串,可以执行

std::transform(msg.begin(), msg.end(), msg.begin(), std::tolower);

Transform以begin和end迭代器作为第一个和第二个参数,对于该范围内的每个元素,应用第四个参数(一个函数),并将其赋值给第三个迭代器所指向的对象,并对其加1。通过传递msg.begin()作为第一个和第三个参数,它将把函数的结果赋值给它传递给它的结果。所以transform会这样做:

for (auto src = begin(msg), dst = begin(msg); src != end(msg); ++src, ++dst)
    *dst = tolower(*src);

但是使用transform要好得多。

要检查字符串是否包含任何子字符串列表,您可以使用for循环和vector:

vector<string> bad_strings { "bad word 1", "bad word 2", "etc" };
for (auto i = begin(bad_strings); i != end(bad_strings); ++i)
    if (msg.find(*i)) {
        SendMsg("You cannot say that word!");
        break; // stop when you find it matches even one bad string
    }