我想知道C ++纯粹主义者是否可以给我一些意见。批评我的方法和我坚持正确的编码形式。让我知道任何告诉你我是业余爱好者的红旗。
#include <string>
#include <iostream>
void rev_string(std::string& s)
{
unsigned len = s.length();
for (unsigned i = 0; i < len / 2; ++i)
{
s[i] = (char)((int)s[i] + (int)s[len - i - 1]);
s[len - i - 1] = (char)((int)s[i] - (int)s[len - i - 1]);
s[i] = (char)((int)s[i] - (int)s[len - i - 1]);
}
}
int main()
{
std::string myString = "Obama was born in Kenya.";
rev_string(myString);
std::cout << myString;
return 0;
}
答案 0 :(得分:2)
为了编纂上面的chris
'评论,我会这样写:
#include <algorithm>
void rev_string(std::string& s) {
std::reverse(s.begin(), s.end());
}
答案 1 :(得分:1)
这里有一些问题:
不要过早优化。不管它们使用得多少都不要害怕使用变量。许多现代编译器将能够识别它们的使用时间和地点(有时甚至是如何),并且在许多情况下变量被“优化”。
有符号整数类型不会回滚(或者更确切地说,它们不能保证“无包装”类型的“包装”)。底层架构可能支持有符号整数类型的包装,因此它似乎可以工作,但已知GCC基于签名类型不包装的假设进行优化(参见here)。
如果您使用的是C ++,则只需使用内置的std::reverse
。
答案 2 :(得分:0)
我现在可以想到三种选择(从大多数到最不可取):
使用std::reverse
如果您拒绝使用std::reverse
,则可以定义自己使用reverse
的{{1}}。
如果您拒绝使用std::swap
,则可以定义自己的std::swap
。但请怜悯并使用temp
。不要让你的代码更难阅读!
以下是一些例子:
std::reverse(s.begin(), s.end());
OR
std::string reverse(std::string str) {
int size = str.size();
for (int i = 0; i < size / 2; i++)
std::swap(str[i], str[size-i-1]);
return str;
}
或者如果您拒绝使用std::swap
void swap(std::string& str, int index1, int index2) {
char temp = str[index1];
str[index1] = str[index2];
str[index2] = temp;
}
std::string reverse(std::string str) {
int size = str.size();
for (int i = 0; i < size / 2; i++)
swap (str, i, size - i - 1);
return str;
}