1

重複の可能性:
C ++で文字列を回転させますか?
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|^

「^」は先頭で、「|」は 終わり。どうすればいいですか?

4

3 に答える 3

12

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

string foo = "abcdefg";
std::rotate(foo.begin(), foo.begin() + 3, foo.end());
cout << foo << endl; //prints defgabc
于 2012-07-26T11:24:56.277 に答える
0

を使用したアンドリューのソリューションもお勧めしstd::rotate()ます。しかし、OPがコメントで他の解決策を求めたので、ここで他のアイデアを「トロール」したいと思います。これはあまり効率的ではありません:

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

もう1 つのアイデアは、Doug McIlroy、Brian Kernighan、および PJ Plauger に遡ります。両手を横に並べ、親指を同じ方向に向けます。(手のひらを体に当てて、片手をもう一方の上に置く方が簡単な場合があります。) それぞれの手を回してから、両手を接続します。

_|||| _||||   =>  ||||_ ||||_   =>  _|||| _|||| 
 \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());
于 2012-07-26T13:12:06.487 に答える
0

自分で実装したい場合...

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;
}
于 2012-07-26T11:46:59.233 に答える