gpt4 book ai didi

C++查找子字符串中字符串的最后一次出现

转载 作者:太空狗 更新时间:2023-10-29 20:02:08 24 4
gpt4 key购买 nike

我需要一种方法来帮助我在另一个子字符串中找到一个字符串,或者换句话说,在其他字符串的子范围内找到一个字符串。此外,我需要以相反的顺序查找它,因为我知道我要查找的字符串已关闭到用作“haystack”的子字符串的末尾。

让我们假设下面的一段代码,其中 rfind_in_substr 是我要求的方法:

std::string sample("An example with the example word example trice");

// substring "ample with the example wo"
std::size_t substr_beg = 5;
std::size_t substr_size = 24;

// (1)
std::size_t pos = rfind_in_substr(sample, substr_beg,
substr_size, "example");

// pos == 20, because its the index of the start of the second
// "example" word inside the main string.

当然,第 (1) 行可以替换为:

std::size_t pos = substr_beg + sample.substr
(substr_beg, substr_size).rfind("example");

但这意味着子字符串的一个不必要的拷贝。有什么方法或 C++/boost 方法可以帮助我做到这一点吗?

我正在查看 boost::algorithm::string 库,但我什么也没找到(我已经理解)。我知道 C++17 有 std::string_view 类,那将是完美的,但我使用的是 C++14。

最佳答案

来自 Boost.StringAlgo:

#include <boost/algorithm/string/find.hpp>

auto haystack = boost::make_iterator_range(str.begin() + from, str.begin() + from + len);
auto found = boost::algorithm::find_last(haystack, needle);

现在,如果您需要将它与 std::string 中的其他成员函数一起使用,您需要执行额外的步骤将结果范围转换为索引,如 this answer does ,但如果您不是,则只需使用范围接口(interface)并避免使用 std::string 的“有用”方法。

另一种选择是使用 boost::string_refstd::string_view 基本上基于:

#include <iostream>
#include <boost/utility/string_ref.hpp>


std::size_t rfind_in_substr(std::string const& str, std::size_t from,
std::size_t len, std::string const& s)
{

return from + boost::string_ref(str).substr(from, len).rfind(s);
}

int main()
{
std::string sample("An example with the example word example trice");

// substring "ample with the example wo"
std::size_t substr_beg = 5;
std::size_t substr_size = 24;

// (1)
std::size_t pos = rfind_in_substr(sample, substr_beg,
substr_size, "example");

// pos == 20, because its the index of the start of the second
// "example" word inside the main string.
std::cout << pos << "\n";
}

关于C++查找子字符串中字符串的最后一次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46029127/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com