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