使用C++旋转字符串

Rotating a string using C++

本文关键字:字符串 旋转 C++ 使用      更新时间:2023-10-16

可能重复:
在c++中旋转字符串
如何旋转std::字符串?

我正在用c++制作一个可以使用命令行输入的应用程序。我正在命令行中输入字符串

    int main(int argc, char** argv)
    {
        if(argc != 2)
        {
             cerr << "Invalid number of CMD arguments" << endl;
             return 1;
        }
        string StringValue = argv[1];
        cout << StringValue << endl;
     }

这项工作很好。现在我想循环字符串中的字符。示例:如果我输入单词"STATES"。

    ^STATES|
    |^STATES
    S|^STATE
    ES|^STAT
    TES|^STA
    ATES|^ST
    TETES|^S
    STATES|^

其中"^"是开始,"|"是结束。我该怎么做?

使用std::rotatehttp://www.cplusplus.com/reference/algorithm/rotate/

string foo = "abcdefg";
std::rotate(foo.begin(), foo.begin() + 3, foo.end());
cout << foo << endl; //prints defgabc

如果您想自己实现。。。

int main() 
{
    string StringValue = "^STATES|";
    string aDoubleStr = StringValue;
    aDoubleStr.append(StringValue);
    for(int i = StringValue.length() - 1; i >= 0; i--)
    {
        string aNewStr = aDoubleStr.substr(i , StringValue.length());
        cout << aNewStr.c_str() << endl;
    }
    return 0;
}

我也更喜欢Andrew使用std::rotate()的解决方案。但由于OP在评论中要求其他解决方案,我想在这里"讨论"一些其他想法。这个不是很有效:

std::string value = "^STATES|";
size_t pos = 3;
value = value.substr(pos) + value.substr(0, pos);

另一个想法可以追溯到Doug McIlroy、Brian Kernighan和p.J.Plauger(参见Jon Bentley:Programming Pearls,第2章)。双手并拢,大拇指朝同一方向。(一只手放在另一只手上,手掌紧贴身体可能会更容易。)转动每只手,然后转动双手连接:

_|||| _||||   =>  ||||_ ||||_   =>  _|||| _|||| 
 L /   R/       L /   R/         R /   L/ 

在C++中:

std::string::iterator mid = value.begin() + pos;
std::reverse(value.begin(), mid);
std::reverse(mid, value.end());
std::reverse(value.begin(), value.end());