web-dev-qa-db-ja.com

指定した文字数で文字列を作成する

C++での初期化時に256文字の文字列を作成する方法はありますか?

私の課題の一部では、「1。256文字の文字列を作成します。名の繰り返しを使用してください。」

ループを使用する以外にこれを行う方法はよくわかりませんが、もっと簡単な方法があるように感じます。

37
sircrisp

basic_string のコンストラクタ参照を見ると、完全なstringを繰り返す簡単な方法がないことがわかります。 1文字の場合、次のように(2)を使用できます。

std::string s(5, 'a'); // s == "aaaaa"

文字列の繰り返しを生成するには、いくつかの回避策が必要になります。たとえば、std::generate(アルゴリズムを楽しんでいる)などの文字列を入力するだけで、このポスト構築を簡単に実行できます。

#include <string>
#include <algorithm>

// ...

std::string pattern("Xeo ");
auto pattern_it = pattern.begin();
std::string s(256, '\0');
std::generate(s.begin(), s.end(),
    [&]() -> char { 
      if(pattern_it == pattern.end())
        pattern_it = pattern.begin();
      return *pattern_it++; // return current value and increment
    });

実例

92
Xeo

非常に長い文字列が必要な場合は、2倍にすることでループの繰り返し回数を減らすことができます。

#include <string>
using std::string;

string repeatToLength ( unsigned len, string s ) {
  string r, si = s;

  // add all the whole multiples of s.
  for ( unsigned q = len / s.size(); q > 0; q >>= 1 ) {
    if ( q & 1 ) r += si; // add si to r if the low bit of q is 1
    si +=  si; // double si
  }
  r += s.substr ( 0, len - r.size() ); // add any remainder
  return r;
}
2
Daniel Patru
const string myName = "Blivit";
int numLeftOver = 256 % myName.length();

string Names;
for ( int Index = 0; Index < (256 / myName.length() ); ++Index ) {
   Names += myName;
}
Names += myName.substr(0, numLeftOver); 

これは、文字列を生成する場合です。私はこれを行うためのより短い方法があるとかなり確信しています...

1
bspikol

http://www.cplusplus.com/reference/string/string/

私が理解している限り、あなたは256個の要素だけを予約したいでしょう。

そのためのコンストラクタはなく、初期化時にcapacity()を設定することはできません。おそらく、初期化後に.reserveを使用したいでしょう。 reserve()に注意してください:

これにより、文字列内のストレージスペースのサイズを拡大または縮小できますが、この関数を呼び出した後の結果の容量は必ずしもres_argと同じである必要はなく、res_argと同じかそれより大きくなる可能性があるため、リクエストを縮小する場合とそうでない場合があります。特定のライブラリ実装で割り当てられたスペースの実際の削減を生成します。

多分あなたは別のタイプが必要ですか?

使用するよりも文字列を入力するだけの場合:

http://en.cppreference.com/w/cpp/string/basic_string/basic_string 2番目。

1
CyberGuy