使用std :: equal查找字符串是否以子字符串开头

时间:2015-11-04 09:02:37

标签: c++ string c++11

请你指出我在这里做错了什么?

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));
    };

总是回归真实。

我知道还有很多其他解决方案,但我想知道这里的错误是什么。

编辑:

调试运行! enter image description here

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);

1 个答案:

答案 0 :(得分:1)

我不会使用像whole_stringstarting_substring这样的长标识符。从参数声明中可以清楚地看出lambda处理字符串。名称太长会使代码的可读性降低。 使用通用函数std::beginstd::end是没有意义的。 lambda是专门为字符串编写的。

此外,您只能使用一个return语句。例如

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() );
}