2015-11-04 133 views
-2

请问我可以指点我在这里做的错误事情吗?如果字符串以子字符串开头,使用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。

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

编辑:

调试运行! 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

向我们展示了一些测试用例,乍一看似乎很确定。 – 101010

+3

看起来[很好](http://coliru.stacked-crooked.com/a/60aa2f0fc14400ad)给我。 – TartanLlama

+0

调试过程中的屏幕截图被添加了 –

回答

1

我不会用这么长的标识符像whole_stringstarting_substring。从参数声明中可以清楚的看到lambda处理字符串。名称过长会使代码不易读。 而且没有意义使用通用函数std::beginstd::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完全没有。你的功能是正确的,但看起来太复杂了。 –

相关问题