c++ - 关于效率的问题

标签 c++

因此,在学习 Udemy over C++ 类(class)时,其中一个挑战是检查字符串是否为回文。我成功地完成了任务,但以与导师不同的方式去做。我知道有多种方法可以完成一项任务,但我想知道哪种方法更有效,为什么?在重新自学编码时想知道这一点似乎很愚蠢,但我觉得这是我应该牢记的。

//Instructors code//

# include<iostream>
using namespace std;

/*program for reverse a string and check a string is a palidrome

*/
int main()
{
    string str="MADAM";
    string rev="";
    int len=(int)str.length();
    rev.resize(len);
    for(int i=0, j=len-1; i<len; i++, j--)
    {
        rev[i]=str[j];
    }
    rev[len]='\0';  
    if(str.compare(rev)==0)
        cout<<"palindrome"<<endl;
    else
        cout<<"not a pallindrome"<<endl;
    return 0;
}

我的方法
#include <iostream>
using namespace std;

int main(){
    string str1="test";
//    cout << "Enter a string to check if it is a Palindrome: ";
//    getline(cin,str1);

    string str2;

    string::reverse_iterator it;
    for(it=str1.rbegin(); it!= str1.rend(); it++)
    {
        str2.push_back(*it);

    }
    if(!str1.compare(str2))
        cout << "\nPalindrome";
    else
        cout << "\nNot a Palindrome";
    return 0;
}

先感谢您。

最佳答案

从理论上讲,您的讲师提供的代码更有效,但是这两个示例都有问题。

对于您的讲师代码,主要问题是使用

int len=(int)str.length();

在这个例子中,这是可以的,因为我们知道字符串的大小将适合 int。 ,但如果您从外部来源获取字符串,这可能是个问题。一个 std::string使用无符号整数类型来存储字符串的大小,这意味着您可以拥有一个大小大于 int 的字符串。 .如果发生这种情况,那么代码将无法正常工作。

使用您的代码,您可以避免所有这些,这很好,但您也会在桌面上留下一些性能。理论上你的代码
for(it=str1.rbegin(); it!= str1.rend(); it++)
{
    str2.push_back(*it);

}

将导致str2随着新缓冲区的增长,分配多个缓冲区并从旧缓冲区复制到新缓冲区。这是您不需要做的大量额外工作,因为您已经知道需要分配多少空间。有
str2.reserve(str1.size() + 1);

在循环预先分配您需要的所有空间之前,这样您就不会受到那些潜在的性能影响。

然后我们发现您的两个示例都使用了第二个字符串。您不需要另一个字符串来检查回文。您可以做的只是检查第一个字符和最后一个字符是否相同,以及它们是否继续移动到第一个+1 和最后一个字符,依此类推,直到您到达中间或它们不匹配。您可以使用类似的构造来做到这一点
bool is_palindrome = true;
for (auto start = str.begin(), end = str.end() - 1; 
     start < end && is_palindrome; 
     ++start, --end)
{
    if (*start != *end)
        is_palindrom = false
}
if (is_palindrome)
    std::cout << "palindrome\n";
else
    std::cout << "not a pallindrome\n";

关于c++ - 关于效率的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62140998/

相关文章:

c++ - Visual Studio 2015 在创建简单的测试控制台程序时给了我错误

c++ - 模板中允许标量和 vector 类型

c++ - 从函数 C++ 返回数组

c++ - 我如何向图书馆工作组提出一项功能?

c++ - 'else' 之前的预期主表达式

c++ - 如何将 'CDT' 转换为 time_zone_ptr

c++ - QScrollArea 小部件未使用 Flowlayout 扩展

c++ - 从 Oracle PL/SQL 获取数据到主机阵列

c++ - 这个重新分配是否正确?

C++ "typeid"错误 : operator not allowed in a constant expression