与 std::memcmp 或 string::compare 进行子字符串比较?
Substring comparision with std::memcmp or string::compare?
我想在另一个字符串中查找给定的字符串。可能的起始位置由先前的计算已知。示例:
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;
}
两者是等价的吗?如果关键字长度超过起始位置的输入长度,则与 memcmp
的比较仍然是正确的。 strncmp
是更安全的方法吗?
你可以使用 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";
true false false
它是安全的,而且是多余的,因为 std::char_traits<char>::compare
在大多数标准库供应商上都使用 memcmp
(我检查了 VC++ 和 GCC,它使用 memcmp
和 __builtin_memcmp
分别)。
至于性能 - 它不会有太大变化。
最好坚持 std::string::compare
。
我想在另一个字符串中查找给定的字符串。可能的起始位置由先前的计算已知。示例:
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;
}
两者是等价的吗?如果关键字长度超过起始位置的输入长度,则与 memcmp
的比较仍然是正确的。 strncmp
是更安全的方法吗?
你可以使用 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";
true false false
它是安全的,而且是多余的,因为 std::char_traits<char>::compare
在大多数标准库供应商上都使用 memcmp
(我检查了 VC++ 和 GCC,它使用 memcmp
和 __builtin_memcmp
分别)。
至于性能 - 它不会有太大变化。
最好坚持 std::string::compare
。