【问题标题】:Alternative for a loop in C++C ++中循环的替代方案
【发布时间】:2020-03-21 19:09:31
【问题描述】:

我想在不使用循环的情况下反转字符串。我的循环代码如下:

#include <iostream>
#include <string>

using namespace std;

string reverseString(string str) {
    string changedString;
    int strLength = int(str.length() - 1);
    for(int i {strLength}; i >= 0; i--) {
        changedString.push_back(str.at(i));
    }
    return changedString;
}

int main() {

    string str;

    cout << "Enter a string to reverse it:\n" << flush;
    cin >> str;
    cout << reverseString(str) << flush;
} 

现在我需要编写一个没有循环的函数。只能使用 String 的方法。你能帮我解决这个问题吗?

【问题讨论】:

  • 这能回答你的问题吗? How to reverse an std::string?
  • 顺便说一句,当您通过值传递字符串时,您可以将反转存储在参数本身中并删除changedString,或者通过引用传递以避免不必要的复制
  • 这能回答你的问题吗? How do you reverse a string in place in C or C++?
  • 为了重复一个过程,您将需要一个循环,无论您是明确编写循环还是使用具有循环的函数。甚至递归也可以被认为是一个循环。

标签: c++ string algorithm loops reverse


【解决方案1】:

写这样的函数很简单

std::string reverse( const std::string &s )
{
    return { s.rbegin(), s.rend() };
}

这是一个演示程序

#include <iostream>
#include <string>

std::string reverse( const std::string &s )
{
    return { s.rbegin(), s.rend() };
}

int main() 
{
    std::string s( "Hello World" );

    std::cout << s << '\n';
    std::cout << reverse( s ) << '\n';

    return 0;
}

它的输出是

Hello World
dlroW olleH

【讨论】:

    【解决方案2】:

    嗯,你可以使用递归来做到这一点。如果您不知道什么是递归,这里有一些链接:link1link2。 从技术上讲,它不会是一个循环。

    string reverseString(string str, int index, string ans) {
        if (index == -1) return ans;
        ans += str[index];
        return reverseString(str, index - 1, ans);
    }
    

    这个函数的参数默认是str,index = size(str) - 1 and ans ans = ""; 以 reverseString(str, size(str) - 1, "") 为例。

    如果你希望你的函数只接受一个参数,那么你可以编写包装函数,而我写的那个将有不同的名称——例如 reverseStringWrapper,而在 reverseString 中只有一行——return reverseStringWrapper(str, size( str) - 1, "");

    string reverseStringWrapper(string str, int index, string ans) {
        if (index == -1) return ans;
        ans += str[index];
        return reverseString(str, index - 1, ans);
    }
    
    string reverseString(string str) {
        return reverseStringWrapper(str, size(str) - 1, "");
    }
    

    【讨论】:

    • 同样可以通过一个函数和第二个和第三个参数中的适当默认值来实现。 (也许,从str 的末尾开始计数index = 0。)
    【解决方案3】:

    这是怎么回事?

    • 在c中,可以使用strrev()函数来反转字符串(char*)
    • 在 c++ 中,您可以使用 std::reverse() 或 StringBuilder.reverse() 反转字符串的方法。

    。 这样就可以反转char数组(char*)。

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    
    // Function to reverse a given character array using std::reverse
    void reverse(char *str)
    {
        std::reverse(str, str + strlen(str));
    }
    
    // main function
    int main()
    {
        /* using C string */
        char s[] = "Hello World";
    
        reverse(s);
        cout << "Reverse of the given string is : " << s;
    
        return 0;
    }
    

    这样你可以反转字符串。

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    
    // Function to reverse a given character array using std::reverse
    void reverse(char* str)
    {
        std::reverse(str, str + strlen(str));
    }
    
    // main function
    int main()
    {
        /* using C string */
        // char s[] = "Techie Delight";
        string s = "hello world";
        int n = s.length(); 
    
        // declaring character array 
        char char_array[n + 1]; 
    
        // copying the contents of the 
        // string to char array 
        strcpy(char_array, s.c_str()); 
        reverse(char_array);
        s = char_array;
        cout << "Reverse of the given string is : " << s;
    
        return 0;
    }
    

    希望这可能会有所帮助:)

    【讨论】:

    • std::reverse 的用法在the other answer 中已经提到(即使没有将std::string 不必要地复制到char[])。顺便提一句。 VLAs 不是 C++ 标准的一部分。而且,你为什么提到c?这个问题被标记为c++(并且只有c++)。
    • @Scheff 没有提到std::reverse 的用法的答案。这是与其他答案不同的答案。
    • 关于,std::reverse() 你是对的 - 我的错。 (我忽略了它即使没有std::reverse() 也可以工作。)但是,其余的仍然是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2015-07-30
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多