質問を説明するのは少し難しいですが、2 つの交互の文字を表示する必要があるとします。
for(int n=0; n<20; n++)
{
cout<<(n%2==0 ? 'X' : 'Y');
}
上記のタスクを達成するためのワンライナーまたはより効率的な方法はありますか? (つまり、<iomanip>
のようなものを使用setfill()
)?
質問を説明するのは少し難しいですが、2 つの交互の文字を表示する必要があるとします。
for(int n=0; n<20; n++)
{
cout<<(n%2==0 ? 'X' : 'Y');
}
上記のタスクを達成するためのワンライナーまたはより効率的な方法はありますか? (つまり、<iomanip>
のようなものを使用setfill()
)?
私はそれをシンプルに保つと思います:
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";
文字列を扱っていて、簡潔なコードがパフォーマンスよりも重要である場合(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!
かっこいいですね。
の妥当な上限がある場合は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()