C ++获取子字符串的地址

时间:2016-12-10 04:37:12

标签: c++ string

我们说我有2个字符串S1 = "zzzzabra"S2 = "abracadabra"

我想知道,例如,如果S1[4:8]S2的前缀。

好的,我可以获取子串S1.substr(4,4)并传递给某些前缀测试函数。

但问题是:因为我不会改变字符串,所以我不想传递副本,而只是传递它开始的地址,例如。

有可能吗?例如,如果我有一些比较函数cmpPrefix(string &s1, string &s2),如果我想检查S1[4:8]是否为S2的前缀,我应该传递给它什么?

我会多次进行这种比较操作,我想我不应该浪费时间和不必要的副本。另外我想保持代码干净,所以一开始我不想在函数中放入很多参数来做这个技巧。

3 个答案:

答案 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::searchstd::beginstd::end的一般性质,这甚至适用于char const[]

char const S1[] = "zzzzabra";
char const S2[] = "abracadabra";

答案 2 :(得分:0)

C函数:strstr(),也许检查strcmp()[来自C ]

C ++字符串函数:compare()

他们都只接受地址。

确保使用c_str()将C ++字符串转换为C字符串。