はい、ポインター演算とmemcpy
. ただし、C++ を使用してstd::string
いるので、s に固執し、それらが私たちのために a を行うと仮定しmemcpy
ましょう。
std::vector<std::string> output;
output.reserve(line.length() / 21 + (line.length() % 21) ? 1 : 0);
auto i = line.begin(), j = i + 21;
for(; line.end() - j > 21; i = j, j+= 21)
{
output.emplace(i, j)
}
if(j != line.end())
{
output.emplace(j, line.end());
}
それで、ここで何が起こっているのですか?std::string
この目的のためには、a をchar
配列とlength
変数と考えれば十分です。
まず、出力用に十分なスペースを確保します。あなたもこれをしました。
i
次に、2 つの変数とを定義しますj
。i
現在の部分文字列の先頭とj
1 つ後ろの反復子を表します。string
ここでの反復子は、のchar
配列の内部構造へのポインターと考えることができますchar*
。
次に、元の文字列を一度に 1 行ずつ反復処理します。正しい場所emplace
に a の新しい要素を構築するだけです。vector
この呼び出しは C++11 と同等output.push_back(std::string(i, j))
であり、C++11 でのみ使用できます。
最後に、を使用して別のチャンク全体があるかどうかを確認しline.end() - j > 21
ます。は、配列line.end()
の 1 つ後ろのイテレータです。文字があればその文字を指します。チャンク全体がない場合は、 を使用して部分チャンクをチェックします。char
NUL
j != line.end()