gpt4 book ai didi

c++ - 为什么用于字符串比较的 == 运算符相对于任一字符串长度是线性时间(看起来)?

转载 作者:行者123 更新时间:2023-12-02 03:59:55 27 4
gpt4 key购买 nike

#include <iostream>
#include <chrono>
#include <string>
using namespace std::chrono;
int main(int arc, char* argv[]) {
const std::string password = "a";
int correct = 1;
auto start = high_resolution_clock::now();
if(password != argv[1])
correct = 0;
auto end = high_resolution_clock::now();
auto elapsed = duration_cast<nanoseconds> (end-start).count();
std::cout << "time: " << elapsed << "\n";
return correct;
}

比较“a”==“b”和“a”==“bbbbbbbbbbbbbb...”(长度~250)平均需要超过 50% 的时间。

为什么会出现这样的情况呢?字符串比较函数在看到第一个字符不相等(或者字符串的长度不相等)后是否应该立即中断?

许多引用文献还提到字符串比较是两个输入字符串长度的线性复杂性(例如 https://en.cppreference.com/w/cpp/string/basic_string/operator_cmp )。我不明白为什么会这样..非常感谢任何帮助。

最佳答案

字符串==运算符依赖于compare()方法。查看 TDMGCC 上可用的实现,我发现:

// This is the overloaded one called when you compare to argv[1]
template<typename _CharT, typename _Traits, typename _Alloc>
int
basic_string<_CharT, _Traits, _Alloc>::
compare(const _CharT* __s) const
{
__glibcxx_requires_string(__s);
const size_type __size = this->size();
const size_type __osize = traits_type::length(__s);
const size_type __len = std::min(__size, __osize);
int __r = traits_type::compare(_M_data(), __s, __len);
if (!__r)
__r = _S_compare(__size, __osize);
return __r;
}

如您所见,在比较长度之前,它首先调用 traits_type::compare(),它基本上是 memcmp():

      static int
compare(const char_type* __s1, const char_type* __s2, size_t __n)
{ return __builtin_memcmp(__s1, __s2, __n); }

因此,如果我没记错的话,比较将是您提到的线性时间。

关于c++ - 为什么用于字符串比较的 == 运算符相对于任一字符串长度是线性时间(看起来)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60125253/

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