我们说我有2个字符串S1 = "zzzzabra"
和S2 = "abracadabra"
。
我想知道,例如,如果S1[4:8]
是S2
的前缀。
好的,我可以获取子串S1.substr(4,4)
并传递给某些前缀测试函数。
但问题是:因为我不会改变字符串,所以我不想传递副本,而只是传递它开始的地址,例如。
有可能吗?例如,如果我有一些比较函数cmpPrefix(string &s1, string &s2)
,如果我想检查S1[4:8]
是否为S2
的前缀,我应该传递给它什么?
我会多次进行这种比较操作,我想我不应该浪费时间和不必要的副本。另外我想保持代码干净,所以一开始我不想在函数中放入很多参数来做这个技巧。
答案 0 :(得分:2)
string str1 = "abcdwgyz";
string str2 = "wxyzpqrs";
return (str1.compare(4, 4, str2.substr(0, 4)) == 0);
答案 1 :(得分:1)
但问题是:因为我不会改变字符串,所以我不愿意 例如,传递一份副本,但只是一个地址。
首先,那是不成熟的优化。不要太担心复制语义。
其次,考虑迭代器而不是地址。一旦你意识到你可以使用begin()
和end()
之类的函数对字符串元素进行随机访问迭代,那么你就可以使用标准C ++算法的整个库。
std::search
听起来像你需要的。这是一个例子:
#include <string>
#include <algorithm>
#include <iostream>
int main()
{
std::string const S1 = "zzzzabra";
std::string const S2 = "abracadabra";
using std::begin;
using std::end;
auto const result = std::search(
begin(S2),
end(S2),
begin(S1) + 4,
begin(S1) + 8
);
if (result == begin(S2))
{
std::cout << "prefix\n";
}
}
请注意,由于std::search
,std::begin
和std::end
的一般性质,这甚至适用于char const[]
:
char const S1[] = "zzzzabra";
char const S2[] = "abracadabra";
答案 2 :(得分:0)
C函数:strstr(),也许检查strcmp()[来自C ]
C ++字符串函数:compare()
他们都只接受地址。
确保使用c_str()将C ++字符串转换为C字符串。