具有常量引用的函数作为输入

时间:2015-06-06 02:12:01

标签: c++ string reference

我正在尝试创建一个函数,该函数将字符串的常量引用作为输入,并在字符串的每个字符向右旋转1个位置后返回字符串。使用引用和指针仍然让我困惑,我不知道如何从常量引用中获取字符串。

string rotate(const string &str){
     string *uno =  &str;
     string dos = rotate(uno.rbegin(), uno.rbegin() + 1, uno.rend());
     return dos;}

这是我到目前为止所得到的,但它没有编译。有关如何从常量引用中正确获取字符串的任何提示将不胜感激。

4 个答案:

答案 0 :(得分:7)

您无法在不违反参数const合约的情况下就地执行轮换,因此您应该复制输入并返回一个新字符串:

string rotate(const string &str){
     string uno = str;
     rotate(uno.rbegin(), uno.rbegin() + 1, uno.rend());
     return uno;
}

另一个合理的选择是使用std::rotate_copy

答案 1 :(得分:2)

该行

string* uno = string &str;

毫无意义。我想你的意思是

string* uno = const_cast<string*>(&str);

答案 2 :(得分:1)

你可以考虑这个旋转:

// rotate last char to front
std::string rotate(const std::string& str)
{
   return(str[str.size()-1]  + 
          str.substr(0,str.size()-1));
}

// 'abcdefghijklmnopqrstuvwxyz'
// 'zabcdefghijklmnopqrstuvwxy'

答案 3 :(得分:1)

您可以传入一个字符串来接收旋转的字符串,从而避免按值复制返回。

我通过指针传递字符串,因为它在呼叫站点上更清楚,它打算被改变,但如果愿意的话,它可以很容易地通过引用传递。

#include <string>
#include <iostream>
#include <algorithm>

void rotate(std::string const& str, std::string* out)
{
     *out = str;
     std::rotate(out->rbegin(), out->rbegin() + 1, out->rend());
}

int main(int, char**)
{
    std::string out;

    std::string x = "1234567";
    std::cout << x << '\n';

    ::rotate(x, &out);

    std::cout << out << '\n';
}