我在玩一些代码,我写了这个小类来池 std::wstring。当我描述它时,我想知道你对这么简单地接近一个字符串池的看法。
我有一个 std::vector 的 std::wstring 和两个映射,一个用于保存向量中未使用元素的索引,另一个用于保存正在使用的元素。
如果使用 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;
};