現在、シーケンシャル テキスト キーの生成が必要なプロジェクトに取り組んでいます。コンストラクターがキーに変換する特定のキーに対応する整数をキー ジェネレーターにシードする必要があります。
私のキー ジェネレーターはインクリメント演算子をオーバーロードして、文字列が直接インクリメントされるようにします。これは、インデックス値をインクリメントしてから、インデックスを生成したいすべてのキーのキーに変換するという以前に行っていたことではありません。
私の問題は、キーを生成するときに使用したい文字セットが限られていることです。インクリメントしたいキー内の文字を見つけ、それが文字セット内のどこにあるかを調べ、セット内の次の文字を見つけてから、キー内の文字をセット内の次の文字に置き換える必要があります。
これが私のコードです:
// Not the full charset
std::string charset = "abcdefghijklmnopqrstuvwxyz0123456789";
std::string key;
key.push_back(charset[0]);
for(unsigned int place = 0; place < key.length(); place++)
{
if(key[place] == charset[charset.length() - 1])
{
// Overflow, reset char at place
key[place] = charset[0];
if((key.length() - 1) < (place + 1))
{
// Carry, no space, insert char
key.insert(key.begin(), charset[0]);
break;
}
else
{
// Space available, increment next char
continue;
}
}
else
{
// Increment char at place
key[place] = charset[charset.find(key[place]) + 1];
break;
}
}
プロファイリングでは、検索操作が実際に速度を低下させていることがわかりました。これを行うより速い方法はありますか?文字セットからリンクされたリストを作成することを考えましたが、その前に、これについていくつかの入力が必要です。