标准池:wstring.是不是这种做法太幼稚了

Pool of std:wstring. Is this approach too naive?

本文关键字:wstring 是不是 标准      更新时间:2023-10-16

我正在玩一些代码,我写了这个小类来池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对象没有多大帮助,内容仍将动态分配。