3

配列全体をループする以外に、char配列をチャンク(たとえば21文字/配列)に分割するより高速/効率的な方法はありますか?

これが今の私の試みです

const char* arr = line.c_str();
char smallArr[(int)ceil((double)strlen(arr)/(double)21)][21];
int arrSisze[(int)ceil((double)strlen(arr)/(double)21)][1];
int m=0;int n=0;
for (int i=0; i<strlen(arr); i++) {
    smallArr[m][i]=arr[i];
    arrSisze[m][0]=(i+1)-n;
    if ((i-n)==19) {
        m++;
        n+=20;
    }
}
4

3 に答える 3

3

1) memcpy の使用

char myname[] = "hello";
char dest[20] = {0};    
/* using memcpy to copy string: */
 memcpy ( dest, myname, 5);

2) strncpy の使用

char str1[]= "To be or not to be";
char str2[40];

strncpy ( str2, str1, sizeof(str2) );
于 2013-06-16T06:53:54.980 に答える
3

はい、ポインター演算と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 つの変数とを定義しますji現在の部分文字列の先頭とj1 つ後ろの反復子を表します。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 つ後ろのイテレータです。文字があればその文字を指します。チャンク全体がない場合は、 を使用して部分チャンクをチェックします。charNULj != line.end()

于 2013-06-16T06:48:45.263 に答える
0

標準ライブラリを再最適化しないでください。

  • std::string がある場合は、それを使用してください。
  • 整数の計算に浮動小数点を使用しないでください。整数の算術演算を適切に使用してください。
  • 問題の複雑さは O(1) です。他のソリューションでは、ストリング ウォーク スパンが 1 つ未満であり、関連するコピーでそれをカバーすることはできません。
  • C++ を適切に使用し、 C を忘れてください。

=

std::vector<std::string> chunks;
chunks.resize(21);
size_t chunksize = line.size()/21+1;
for(size_t i=0,j=0; i<line.size(); i+=chunksize, ++j)
{  chunks[j] = line.substr(i,chunksize); }

sting::sizeは N^0 を要しますが、 strlenN^1 の複雑さを要します (内部にループがあります)。

このコードでは、ループはチャンクで 21^1 であり、substr は各チャンク コンテンツで (N/21)^1 であり、全体の長さが N^1 になります。

文字列の長さを追跡したり、文字列を null で終了したりする必要はありません。すべて std::string クラスによって処理されます。

于 2013-06-16T07:15:38.273 に答える