我正在玩一些代码,我把这个小类写成了池std :: wstring。在我描述它时,我想知道你对于接近一串字符串的看法。
我有一个std :: vector of std :: wstring和两个map,一个用于保存向量中未使用元素的索引,另一个用于正在使用的元素。
如果使用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;
};
答案 0 :(得分:4)
您关注的new
/ delete
不是string
描述符的分配,而是string
数据的分配。汇集string
个对象没有多大帮助,内容仍将动态分配。