【问题标题】:Rotating a string using C++ [duplicate]使用 C++ 旋转字符串 [重复]
【发布时间】:2012-07-26 21:17:48
【问题描述】:

可能重复:
Rotate a string in c++?
How to rotate a std::string?

我正在用 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|^

“^”是开头,“|”结束。我该怎么做?

【问题讨论】:

标签: c++ string


【解决方案1】:

使用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

【讨论】:

  • 如果我想在没有旋转功能的情况下这样做?
  • @user1554408:写你自己的)。但是为什么不使用为此目的创建的标准函数呢?
  • 是否可以循环整个字符串并改变字符串中某个字符的值?
  • @user1554408:是的,有可能:foo[2] = 'A';
  • @user1554408 可以这样做,但是除非这是练习或家庭作业,否则重新实现 std::rotate 没什么意义。
【解决方案2】:

如果你想自己实现...

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

【讨论】:

    【解决方案3】:

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

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

    other idea 可以追溯到 Doug McIlroy、Brian Kernighan 和 P.J. Plauger 8see 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());
    

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多