我正在尝试创建一个函数,该函数将字符串的常量引用作为输入,并在字符串的每个字符向右旋转1个位置后返回字符串。使用引用和指针仍然让我困惑,我不知道如何从常量引用中获取字符串。
string rotate(const string &str){
string *uno = &str;
string dos = rotate(uno.rbegin(), uno.rbegin() + 1, uno.rend());
return dos;}
这是我到目前为止所得到的,但它没有编译。有关如何从常量引用中正确获取字符串的任何提示将不胜感激。
答案 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';
}