【问题标题】:Substring comparision with std::memcmp or string::compare?与 std::memcmp 或 string::compare 的子字符串比较?
【发布时间】:2017-08-28 02:53:03
【问题描述】:

我想在另一个字符串中找到一个给定的字符串。先前计算已知的可能起始位置。示例:

int main()
{
    std::string input("Foo Bar Hash Bang");
    std::string keyword("Bar");

    const char* inputStart = input.c_str() + 4; // at 'B'
    std::cout << "memcmp=" << std::memcmp(inputStart, keyword.c_str(), keyword.length()) << "\n";

    std::cout << "compare=" << input.compare(4, keyword.length(), keyword) << "\n";

    return 0;
}

Ideone

两者是等价的吗?如果关键字长度从起始位置超过输入长度,则与memcmp 的比较仍然是正确的。 strncmp 是更安全的方法吗?

【问题讨论】:

  • 为什么不用std::string提供的find()方法呢?
  • @Oz。表现。那时我已经知道可能的关键字的位置和长度。使用 find() 我必须为整个输入字符串上的每个关键字调用 find 。输入字符串可能根本没有关键字。

标签: c++ string c++14 c++17


【解决方案1】:

它是安全且冗余的,因为std::char_traits&lt;char&gt;::compare 在大多数标准库供应商上都使用memcmp(我检查了VC++ 和GCC,它们分别使用memcmp__builtin_memcmp)。

至于性能 - 它不会有太大变化。

最好坚持std::string::compare

【讨论】:

    【解决方案2】:

    你可以使用std::string_view:

    bool matchSubstring(std::string_view haystack, 
                        std::string_view needle, 
                        std::size_t pos)
    {
        if(haystack.size() < pos + needle.size()) return false;
        return haystack.compare(pos, needle.size(), needle) == 0;
    }
    

    用法:

    std::string input("Foo Bar Hash Bang");
    std::string keyword("Bar");
    
    std::cout << std::boolalpha << matchSubstring(input, keyword, 4) << "\n"
                                << matchSubstring(input, keyword, 5) << "\n"
                                << matchSubstring(input, keyword, 1000) << "\n";
    

    真假假

    live wandbox example

    【讨论】:

    • 我喜欢使用新的 C++17 功能。 substr() 不应该已经处理溢出的可能性吗?子字符串会更短且不匹配。另一方面 substr() 总是创建一个副本。我得先测试一下。
    • substr 创建一个新的string_view - 这应该很便宜。如果值超出范围,它也会抛出,这就是我明确检查它的原因。
    • 另外,我刚刚更新了答案以使用compare :)
    猜你喜欢
    • 2022-12-01
    • 2014-07-15
    • 2012-07-25
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多