それを読んだときに最初に考えたのは、別のアロケーターを使用するアプローチ、つまり、割り当てのコストを回避するために、特定の数の要素を事前に割り当てる方法でした。私はアロケータの定義に慣れていませんが、結果が分かれば興味があります。
それがなければ、別のアプローチがあります。私は自分のtemplate ...
ものを保存しましたが、必要に応じて自分でそれを行うことができると思います.
typedef std::list<...> list_t;
struct fslist: private list_t
{
// reuse some parts from the baseclass
using list_t::iterator;
using list_t::const_iterator;
using list_t::begin;
using list_t::end;
using list_t::empty;
using list_t::size;
void reserve(size_t n)
{
size_t s = size();
// TODO: Do what std::vector does when reserving less than the size.
if(n < s)
return;
m_free_list.resize(n - s);
}
void push_back(element_type const& e)
{
reserve_one();
m_free_list.front() = e;
splice(end(), m_free_list, m_free_list.begin());
}
void erase(iterator it)
{
m_free_list.splice(m_free_list.begin(), *this, it);
}
private:
// make sure we have space for another element
void reserve_one()
{
if(m_free_list.empty())
throw std::bad_alloc();
}
list_t m_free_list;
};
これは不完全ですが、開始する必要があります。また、 splice() は公開されていないことに注意してください。要素を別のリストから、または別のリストに移動すると、サイズと容量の両方が変更されるためです。