【问题标题】:Reversing a string in C++ using a reverse iterator?使用反向迭代器在 C++ 中反转字符串?
【发布时间】:2023-03-28 23:39:02
【问题描述】:

我有以下代码,但我似乎无法找到一种方法来在这里反转字符串:

stringstream convert;
string y="";
string z="";
convert << x;
string::reverse_iterator rit;
y=convert.str();
int j=0;
for (rit = y.rbegin(); rit < y.rend(); rit++){
    z[j] = *rit;
    j++;
}

有人可以帮我解决这个问题吗?谢谢!

【问题讨论】:

  • 旁注。如果您的意图是将数字转换为字符串,则不再需要(可能不需要) stringstreams boost sprintf。 C++11 为各种数字类型重载了 to_string function
  • @Benjamin:很好,我没有意识到这一点。

标签: c++ string iterator


【解决方案1】:
z.assign(y.rbegin(), y.rend());

或者你可以在施工时进行:

std::string z(y.rbegin(), y.rend());

如果要原地修改字符串,请使用 std::reverse:

std::reverse(y.begin(), y.end());

【讨论】:

  • 我决定选择这个,因为这里提供了大量的解释。因为你们都提供了很好的答案,所以我真的在下面这个 Chris Jester-Young 之间纠结。
【解决方案2】:

我会这样做:

stringstream convert;
convert << x;
string y(convert.str());
string z(y.rbegin(), y.rend());
return z;

无需手动编写循环!

【讨论】:

  • 这也是一个很好的答案,我认为尽管 Templatetypedef 在几秒钟内击败了你,但为了代码优化,我最终会接受这个。
  • x 已经是字符串了吗?你可以说,return std::string(x.rbegin(), x.rend());
  • @Kerrek:不太可能,因为stringstream 本质上是用于lexical_cast
  • @Chris -- 正确,我正在使用 stringstream,因为我还没有深入研究 Boost 库,上面代码出现的函数实际上已经返回了一个 bool,所以我不能只是就这样归还。
【解决方案3】:

使用std::reverse 更容易。

std::reverse( source.begin(), source.end() ); // source is of type std::string

【讨论】:

  • 请注意,它将原地反转字符串,不会创建另一个反转的字符串。
  • @Seth - 是的,这就是我没有提到任何返回值的原因。
  • 是的,我知道你知道,但我不知道他知道 :) 只是为了避免歧义和误解而提及它。
【解决方案4】:

我认为你的问题出在这个循环中:

int j=0;
for (rit = y.rbegin(); rit < y.rend(); rit++){
    z[j] = *rit;
    j++;
}

请注意,您在不同位置写入字符串z。但是,您实际上并没有初始化 z 以便其中有任何元素,所以这是写入不存在的位置,这会导致未定义的行为。

要解决此问题,请尝试将新字符附加到末尾,而不是写入 z 中的位置:

for (rit = y.rbegin(); rit < y.rend(); rit++){
    z += *rit;
}

【讨论】:

  • 光荣,感谢您的帮助,这个问题非常简单,以至于我在 20 分钟的大部分时间里都没有回答,谢谢!
  • @Hundering 虽然这个答案是正确的,但您可能不应该这样做,因为它既不简洁也不高效。查看其他一些答案以获得更好的方法。
  • @Hundering- 我写了这个答案,不想让你接受它......你绝对应该使用另一种方法!
猜你喜欢
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2015-05-24
相关资源
最近更新 更多