【问题标题】:Find substring in string with iterators使用迭代器在字符串中查找子字符串
【发布时间】:2024-01-07 03:38:01
【问题描述】:

我有一个由两个迭代器(startend)定义的子字符串。我需要检查这个子字符串是否存在于另一个字符串中。

是否有一个标准库算法或字符串成员我可以使用或调整来执行此操作,而无需为此创建一个全新的字符串对象 (std::string(start, end))?

例如

struct Substring
{
    std::string::const_iterator start, end;
};

auto found = std::contains(whole.begin(), whole.end(), substring.start, substring.end); // ???

【问题讨论】:

标签: c++ string iterator find


【解决方案1】:

std::search

bool found = 
    std::search(hay.begin(), hay.end(), needle.begin(), needle.end()) != hay.end();

【讨论】:

  • 哈哈。我不太确定我是如何忘记/错过 std::search 的。谢谢。
【解决方案2】:

您可以使用std::string::find 方法:

auto found = (whole.find(&*substring.start, 0, substring.end - substring.start)
              != std::string::npos);

相对于std::search 的优势在于std::find 适用于字符串并且可以使用Boyer-Moore 来实现。可悲的是,这不是 gcc 的 libstdc++ 实现它的方式。

【讨论】:

    最近更新 更多