我在 C++ 中创建了一个函数来递归反转字符串,但是之后如何使功能打印一个 endl?
I've created a function in C++ to reverse a string recursively, but how can I make the funtion print a endl afterwards?
这是在C++ 最初的提示是创建一个反转字符串的递归函数。该函数有效,但我不确定在反转字符串后如何endl
函数中输入,以便在控制台中看起来不错。这有效:
string reverse(string str) {
if (str.size() == 1) {
return str;
}
string str2 = reverse(str.substr(1));
return str2 + str[0];
}
这样做怎么样:
string str="Hello";
cout << reverse(str) << endl;
在这里,您将反转字符串,打印它,然后开始一个新行。
您可以使用最后一个字符索引在里面放置换行符,如下所示:
string reverse(string str, int length) {
if (str.size() == 1) {
return str;
}
string str2 = reverse(str.substr(1), length);
// if are at the last character, we just insert a newline after it
if(length == str2.length())
{
return str2 + str[0] + 'n';
}
return str2 + str[0];
}
int main()
{
string str = "Hello";
// we get position of last character
cout << reverse(str, str.length() -1);
return 0;
}
在将字符串参数传递给reverse()
函数之前,您可以在字符串参数前面附加换行符,
string str {"Hello"};
str = "n" + str;
cout << reverse(str);
如果要在reverse
函数定义中执行此操作,则需要跟踪递归的深度,以便可以在递归的第一级中附加换行符,
string reverse(string str, int depth = 0) {
if(depth==0) {
str = "n" + str;
}
depth++;
if(str.size() == 1) {
return str;
}
string str2 = reverse(str.substr(1), depth);
return str2 + str[0];
}
如何在函数反转字符串后获取 endl in 在控制台中看起来不错。
供您考虑,reverse2(((下面,最后一个函数(具有
a) half the recursions
b) appends an eoln char
<小时 />#include <algorithm>
using std::swap;
#include <iostream>
using std::cout, std::endl, std::flush;
#include <string>
using std::string, std::to_string;
// forward declarations
string reverse (string str); // from this post, with fix
//
string reverse2 (string str);
void test1(string s)
{
cout << "n s1: " << s
<< "n r1: " << reverse(s);
cout << " -----" << endl; // highlight lack of eoln
}
void test2(string s)
{
cout << "n s2: " << s
<< "n r2: " << reverse2(s);
cout << " -----"; // highlight eoln appended!
}
int main(int , char** )
{
int retVal = 0;
test1("123456789");
test1("12345678");
test1("123");
test1("45");
test1("6");
test1(""); // empty string
test2("987654321");
test2("87654321");
test2("321");
test2("54");
test2("6");
test2(""); // empty string
return retVal;
}
// implementation from OP's post (with fix for empty string)
string reverse (string str)
{
//if (str.size() == 1) { // fails test case (0 == str.size())
if (str.size() < 2) { // fix
return str;
}
string str2 = reverse(str.substr(1));
return str2 + str[0];
}
// recursive alternative to consider
// left right indx
void reverseR (string& s, int l, int r)
{ // |
// swaps s elements in-place
if ((r - l) >= 0) // recursion termination clause
{
swap(s[static_cast<uint>(l)],
s[static_cast<uint>(r)]); // modify s in place
reverseR (s, l+1, r-1); // recursively call
}
}
// append eoln
string reverse2 (string str) // stack copy, modified-in-place-here
{ // index: v--left right--vvvvvvvvvvvvvv
reverseR (str, 0, (static_cast<int>(str.size()-1))); // recursive swaps
return (str + 'n'); // return result + eoln
}
输出:
s1: 123456789
r1: 987654321 -----
s1: 12345678
r1: 87654321 -----
s1: 123
r1: 321 -----
s1: 45
r1: 54 -----
s1: 6
r1: 6 -----
s1:
r1: -----
s2: 987654321
r2: 123456789
-----
s2: 87654321
r2: 12345678
-----
s2: 321
r2: 123
-----
s2: 54
r2: 45
-----
s2: 6
r2: 6
-----
s2:
r2:
-----
<小时 />更新 - 2020/06/08
仅供参考 - 我简要捕获了一些性能测量。
我在我 8 岁(而且速度很慢(的戴尔上用 Lubuntu 20.04 和 g++ v9.3.0 测量了这些。
您的代码(反向((( 可在 2999 毫秒内处理 461,175 个 50 元素字符串
与我的代码非常相似的东西(reverse2((( 可在 3000 毫秒内处理 13,783,340 个 50 个元素字符串
和 std::reverse,包装在一个符合函数中(但不是递归的( 可在 2999 毫秒内处理 15,917,504 50 个元素字符串
恕我直言,reverse(( 和 reverse2(( 之间的主要区别在于递归期间传递字符串的次数。
我对 std::reverse(( 了解不多,但它的性能给我留下了深刻的印象。
相关文章:
- 在类定义之后定义一个私有方法
- 我在 C++ 中创建了一个函数来递归反转字符串,但是之后如何使功能打印一个 endl?
- C++:忽略第一个 cin.ignore 之后的输入
- 在类的第一个/最后一个实例存在之前/之后调用一对函数.有没有更好的方法?
- 我有一个嵌套数组,它由另一个数组中的元素组成,这些元素分组为2.之后,我想显示每个元素的属性
- win32 c++ 我想在静态标签的文本之后直接插入一个 EDIT 控件
- 构建一个真正、完全静态的Qt 5框架和应用程序(Qt 5.8之后)
- 如何限制文件大小,以便我的程序在变大之后创建一个新文件?并编辑新创建的文件的名称
- 在C 字符串中,为什么在最后一个字符之后,通过索引和()访问索引时行为是不同的
- C :在字符串中找到一个char,然后在先前的char之后找到另一个字符
- 如何在第一个 std::cin 之后阻止终端在 C++ 中关闭
- 我正在尝试在Eclipse中构建一个C 项目,但是即使在使用MINGW路径设置路径变量之后,也会获得构建错误
- 为什么即使在使用 Qt::D irectConnection 之后,接收器的线程中仍会调用插槽?如何确保在另一个线程中调用它?
- 从另一个线程调用shared_from_this但在初始化shared_ptr之后时获取bad_weak_ptr
- 为什么要指向数组或向量中最后一个元素之后的内存位置
- 将数据附加到 csv 文件,在最后一个条目之前而不是最后一个条目之后.C++
- 如何使派生的类成员对齐,以使第一个成员立即出现在基类的最后一个成员之后
- 如何查找一个物体是在一个航路点之前还是之后
- 当第一个 itr 在最后一个 itr 之后时,std::vector 范围构造函数的官方行为是什么?
- 为什么QDrag::target()在QDrag::exec()之后返回一个奇怪的地址