C ++子串检查

时间:2015-03-03 12:03:32

标签: c++11

我给了两个字符串s1,s2和一个整数i。我想检查从索引i开始的s1的子字符串是否与s2相同,等于s2。我知道用一个小循环来实现这是微不足道的,但如果它存在,我宁愿使用库方法。

3 个答案:

答案 0 :(得分:1)

我会首先使用std::equal检查大小是否合适。这样它也可以直接用于矢量。必须检查大小以避免无效的迭代器:

if ( i + s2.size() > s1.size() )
{
    return false;
}
auto s1beg = s1.cbegin() + i;
auto s1end = s1.cbegin() + i + s2.size();
return std::equal(s1beg, s1end, s2.cbegin());

如果要支持任何范围,请使用std::advance创建开始和结束迭代器:

auto s1beg = s1.cbegin();
std::advance(s1beg, i);
auto s2end = s1beg;
std::advance(s2beg, s2.size());

这是demo for both strings and a list.进一步的设计决策可能允许不同的容器类型。

答案 1 :(得分:1)

正如评论中所讨论的,这里是一个使用string :: compare(http://www.cplusplus.com/reference/string/string/compare/

的解决方案
    s1.compare(i,s2.length(),s2)==0

如果(i> = s1.length())会抛出std :: out_of_range异常。否则,它的工作原理。为了避免out_of_range异常,只需添加一些东西来短路比较:

    (i<s1.length()) && (s1.compare(i,s2.length(),s2)==0)

答案 2 :(得分:0)

bool is_sub_string=i <= s1.size() && s1.substr(i, s2.size()) == s2;