5

質問を説明するのは少し難しいですが、2 つの交互の文字を表示する必要があるとします。

for(int n=0; n<20; n++)
{
    cout<<(n%2==0 ? 'X' : 'Y');
}

上記のタスクを達成するためのワンライナーまたはより効率的な方法はありますか? (つまり、<iomanip>のようなものを使用setfill())?

4

3 に答える 3

7

私はそれをシンプルに保つと思います:

static const char s[] ="XY";

for (int n=0; n<20; n++)
    std::cout << s[n&1];

もう 1 つの明白な可能性は、一度に 2 文字を書き出すことです。

for (int n=0; n<total_length/2; n++)
    std::cout << "XY";
于 2013-09-21T06:50:57.487 に答える
6

文字列を扱っていて、簡潔なコードがパフォーマンスよりも重要である場合(Python の場合のように)、次のように記述します。

 static const std::string pattern = "XY";
 std::cout << pattern * n; //repeat pattern n times!

これをサポートするために、この機能を文字列ライブラリに追加します。

std::string operator * (std::string const & s, size_t n)
{
   std::string result;
   while(n--) result += s;
   return result;
}

この機能があれば、他の場所でも使用できます。

std::cout << std::string("foo") * 100; //repeat "foo" 100 times!

ユーザー定義の文字列リテラルがある場合、たとえば_s、次のように記述します。

std::cout << "foo"_s * 15;  //too concise!!

std::cout << "XY"_s * n;  //you can use this in your case!

オンラインデモ

かっこいいですね。

于 2013-09-21T06:01:09.553 に答える
2

の妥当な上限がある場合はn、次を使用できます。

static const std::string xy = "XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY";
cout << xy.substr( 0, n );

または、安全のために、次を追加できます。

static std::string xy = "XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY";
while( xy.size() < n ) xy += "XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY";
cout << xy.substr( 0, n );

最後に、結果のコピーのcout.write( xy.c_str(), n );オーバーヘッドを回避するために、効率が最も重要かどうかを検討してください。substr()

于 2013-09-21T05:50:27.167 に答える