这是一个没有任何临时变量来反转字符串的好方法吗?

时间:2013-08-28 03:53:14

标签: c++

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

3 个答案:

答案 0 :(得分:2)

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

#include <algorithm>

void rev_string(std::string& s) { 
    std::reverse(s.begin(), s.end());
}

答案 1 :(得分:1)

这里有一些问题:

  1. 不要过早优化。不管它们使用得多少都不要害怕使用变量。许多现代编译器将能够识别它们的使用时间和地点(有时甚至是如何),并且在许多情况下变量被“优化”。

  2. 有符号整数类型不会回滚(或者更确切地说,它们不能保证“无包装”类型的“包装”)。底层架构可能支持有符号整数类型的包装,因此它似乎可以工作,但已知GCC基于签名类型不包装的假设进行优化(参见here)。

  3. 如果您使用的是C ++,则只需使用内置的std::reverse

答案 2 :(得分:0)

我现在可以想到三种选择(从大多数到最不可取):

  1. 使用std::reverse

  2. 如果您拒绝使用std::reverse,则可以定义自己使用reverse的{​​{1}}。

  3. 如果您拒绝使用std::swap,则可以定义自己的std::swap。但怜悯并使用temp。不要让你的代码更难阅读!


  4. 以下是一些例子:

    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;
    
    }