-3

我想知道 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;
}
4

3 回答 3

2

为了编纂chris上面的评论,我会这样写:

#include <algorithm>

void rev_string(std::string& s) { 
    std::reverse(s.begin(), s.end());
}
于 2013-08-28T03:55:42.410 回答
1

这里有几个问题:

  1. 不要过早地优化。不要害怕使用变量,无论它们使用得多么少。许多现代编译器将能够识别何时何地(有时以及如何)使用它们,并且在许多情况下变量被“优化”。

  2. 有符号整数类型不回绕(或者更确切地说,它们不能保证像无符号类型那样“回绕”)。底层架构可能支持有符号整数类型的包装,因此它可能看起来可以工作,但众所周知,GCC 会基于有符号类型不包装的假设进行优化(请参阅此处)。

  3. 如果你使用 C++,你应该只使用内置的std::reverse.

于 2013-08-28T04:01:44.607 回答
0

我现在可以想到三个选项(从最理想到最不理想):

  1. 利用std::reverse

  2. 如果你拒绝使用std::reverse,你可以定义你自己reverse的使用std::swap

  3. 如果你拒绝使用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;

}
于 2013-08-28T04:22:58.317 回答