私はいくつかのコードで遊んでいて、この小さなクラスをプール std::wstring に書きました。私がそれをプロファイリングするとき、この単純な文字列のプールにアプローチすることについてのあなたの意見を知りたいです.
私は std::wstring の std::vector と 2 つのマップを持っています。
new_string() で文字列が要求され、空きインデックスが残っていない場合は、ベクトルのサイズを変更し、新しく追加されたインデックスを空きインデックス マップに挿入します。
コードは次のとおりです。
typedef std::wstring string_t;
class string_pool
{
public:
string_pool()
{
grow_factor = 2;
strings.resize(10);
for (size_t i=0; i<10; i++)
{
free_indexes.insert(std::make_pair(&strings[i],i));
}
}
virtual ~string_pool()
{
}
string_t* new_string()
{
if (!free_indexes.size())
{
size_t old_size = strings.size();
size_t new_size = old_size+grow_factor;
for (size_t i=old_size;i<new_size; i++)
{
free_indexes.insert(std::make_pair(&strings[i],i));
}
strings.resize(new_size);
}
iter = free_indexes.begin();
used_indexes.insert(*iter); // Mark the index as used
string_t* str = (*iter).first; // Get a pointer to the string
free_indexes.erase(iter); // Erase the free index
return str;
}
void delete_string(string_t* str)
{
str->clear();
iter = used_indexes.find(str);
free_indexes.insert(*iter); // Mark the index as free
used_indexes.erase(iter); // Erase the used index
}
protected:
std::map<string_t*, size_t> used_indexes;
std::map<string_t*, size_t> free_indexes;
std::vector<string_t> strings;
size_t grow_factor;
std::map<string_t*, size_t>::iterator iter;
};