这是在没有任何临时变量的情况下反转字符串的好方法吗?
Is this an okay way to reverse a string without any temporary variables?
我想知道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;
}
为了编纂上面的chris
评论,我会这样写:
#include <algorithm>
void rev_string(std::string& s) {
std::reverse(s.begin(), s.end());
}
这里有几个问题:
-
不要过早优化。不要害怕使用变量,无论它们使用得多么少。许多现代编译器将能够识别何时何地(有时以及如何(使用它们,并且在许多情况下变量被"优化"。
-
有符号整数类型不环绕(或者更确切地说,它们不能保证像无符号类型那样"换行"(。底层体系结构可能支持有符号整数类型的包装,因此它似乎有效,但众所周知,GCC 会根据有符号类型不包装的假设进行优化(请参阅此处(。
-
如果您使用的是C++,则应仅使用内置
std::reverse
。
我现在能想到三个选项(从最理想到最不理想(:
-
使用
std::reverse
-
如果您拒绝使用
std::reverse
,则可以定义自己的使用std::swap
的reverse
。 -
如果你拒绝使用
std::swap
,你可以定义你自己的。但请怜悯并使用temp
.不要让阅读代码变得更加困难!
以下是一些示例:
std::reverse(s.begin(), s.end());
或
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;
}
相关文章:
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 具有字符串化的可变参数宏的现代/通用方法
- 接收字符串并使用它来调用方法C++
- 如何分隔字符串并将标记传递给方法
- 是否有通用方法可以找到任何以 null 结尾的字符串的长度?
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 在 C++11 中字符串化变量名称的替代方法
- 连接和压缩标准::vector<std::字符串的最佳方法>
- Esp8266 & Nodemcu:返回请求字符串的方法
- 将位字符串转储到二进制文件的最佳方法是什么
- 有没有一种 STL 方法可以找到字符串的所有排列,给出一个以 C++ 为单位的大小?
- 如何将字符串从 C++/CLI 方法返回到调用它的非托管C++
- 返回混合 \ 和 / 的文件系统路径字符串方法
- VS 链接器失败,标准::字符串方法出现"object already exists"错误
- Lua:为自定义用户数据提供一个字符串方法
- 语法错误字符串方法C++
- 返回原始子字符串的子字符串方法
- 为什么我不能在C++中使用这种方法与"char"而不是"字符串"方法?
- 如何使c++字符串函数的行为像Java和c#字符串方法