用于C++中循环的替代方案

3
我想在不使用循环的情况下翻转字符串。我使用循环的代码如下:
#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的方法。你能帮我解决这个问题吗?

这个回答解决了你的问题吗?如何反转一个std::string? - Daniel Langr
顺便提一下,由于你是按值传递字符串的,所以你可以将反转后的字符串存储在参数本身中并删除 changedString,或者通过引用传递来避免不必要的复制。 - 463035818_is_not_a_number
这个回答解决了你的问题吗?如何在C或C++中原地反转字符串? - Adrian Mole
为了重复一个过程,你需要一个循环,无论是显式地编写一个循环还是使用一个带有循环的函数。甚至递归也可以被视为一种循环。 - Thomas Matthews
3个回答

8

编写这样一个函数非常简单

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

3

嗯,您可以使用递归来实现。如果您不知道递归是什么,请参考以下链接:链接1链接2。 从技术上讲,这不会是一个循环。

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和ans ans = ""。例如,reverseString(str, size(str) - 1, "")。
如果您想让您的函数只接受一个参数,您可以编写包装函数。我写的那个函数将有不同的名称——例如reverseStringWrapper,在reverseString中将只有一行——返回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, "");
}

1
可以使用一个函数和第二个和第三个参数中的适当默认值来实现相同的效果。(也许,从 str 的末尾开始计数,起始索引为 index = 0。) - Scheff's Cat

1

这怎么样?

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

通过这种方式,您可以反转字符数组(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 的用法已经在另一个答案中提到了(甚至不需要将 std::string 复制到 char[] 中)。顺便说一下,VLA 不是 C++ 标准的一部分。还有,为什么要提到 [tag:c]?这个问题标记为 [tag:c++](只有 [tag:c++])。 - Scheff's Cat
@Scheff,没有提到使用std::reverse的答案。这与其他答案不同。 - VJAYSLN
关于 std::reverse(),你是对的 - 是我的错。 (我忽略了即使没有 std::reverse() 它也可以工作。)然而,其余部分仍然是正确的。 - Scheff's Cat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接