标准池:wstring.是不是这种做法太幼稚了
Pool of std:wstring. Is this approach too naive?
我正在玩一些代码,我写了这个小类来池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;
};
您关心的new
/delete
不是string
描述符的分配,而是string
数据。 池化string
对象没有多大帮助,内容仍将动态分配。
相关文章:
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 在枚举类型上使用std::max是不是一种糟糕的做法
- std::元组大小,是不是错过了优化?
- 拥有相同方法的静态和非静态版本是不是设计不好
- 他是不是很贪婪
- SDL2:移动所有东西而不是使用视图端口是不是很糟糕
- OOP-我是不是把事情复杂化了
- 在DLL中分配内存并将其指针提供给客户端应用程序,这是不是一种糟糕的做法
- 在C++代码中使用C风格的注释是不是一种糟糕的做法
- 如果我在C++中使用堆,我是不是做错了什么
- 这个简单但有用的模式是不是太简单了,不可能成为一个真正的模式
- 在C++中,通过引用传递常量布尔值是不是不好的
- 在main.cpp中而不是在头文件中定义函数是不是一种糟糕的做法
- 既然智能指针已经存在,那么使用C型指针是不是已经过时了
- LNK2019:未解析的外部符号;我是不是忘了
- 重载一个函数同时获取指针或引用是不是一种糟糕的做法
- 是不是比较意味着一个分支
- 标准池:wstring.是不是这种做法太幼稚了
- 这是什么reinterpret_cast惯例?是不是比static_cast好