如果字符串以子字符串开头,使用std :: equal
问题描述:
请问我可以指点我在这里做的错误事情吗?如果字符串以子字符串开头,使用std :: equal
auto is_start_with = [](std::string const& whole_string, std::string const& starting_substring)->bool{
if (starting_substring.size() > whole_string.size()) return false;
return std::equal(begin(starting_substring), end(starting_substring), begin(whole_string));
};
它总是返回true。
我知道还有很多其他解决方案,但我想知道这里的错误是什么。
编辑:
P.S.我在其他主文件中直接输入字符串,并试用它!
编辑2:
我删除了两下变换比较之前和它的工作!
std::transform(std::begin(fd_name), std::end(fd_name), std::begin(fd_name), ::tolower);
std::transform(std::begin(type_id), std::end(type_id), std::begin(type_id_lower), ::tolower);
答
我不会用这么长的标识符像whole_string
或starting_substring
。从参数声明中可以清楚的看到lambda处理字符串。名称过长会使代码不易读。 而且没有意义使用通用函数std::begin
和std::end
。 lambda是专门为字符串编写的。
你也可以使用只有一个返回statement.`For例如
auto is_start_with = [](std::string const &source, std::string const &target)
{
return !(source.size() < target.size()) &&
std::equal(target.begin(), target.end(), source.begin());
}
甚至像
auto is_start_with = [](std::string const &source, std::string const &target)
{
return (not (source.size() < target.size())) &&
std::equal(target.begin(), target.end(), source.begin());
}
+0
感谢您的建议 –
+0
@HumamHelfawi完全没有。你的功能是正确的,但看起来太复杂了。 –
向我们展示了一些测试用例,乍一看似乎很确定。 – 101010
看起来[很好](http://coliru.stacked-crooked.com/a/60aa2f0fc14400ad)给我。 – TartanLlama
调试过程中的屏幕截图被添加了 –