【发布时间】:2014-12-02 12:15:27
【问题描述】:
每个集合都包含指定顺序的元素。我想为集合的大小指定一个界限,如果插入了一个严格小于(就顺序而言)的新元素并且已经达到指定的大小,自动删除最后一个元素。 p>
当然,我可以这样做:
class bounded_set
{
private:
using set = std::set<Key, Compare, Allocator>;
using iterator = typename set::iterator;
public:
bounded_set(std::size_t size)
: m_size(size)
{ }
std::pair<iterator, bool> insert(Key const& value)
{
if (m_set.size() < m_size)
return m_set.insert(value);
auto last = std::prev(m_set.end());
if (Compare()(value, *last))
{
m_set.erase(last);
return m_set.insert(value);
}
return std::make_pair(last, false);
}
private:
set m_set;
std::size_t m_size;
};
除了 bounded_set 不是最好的名称(因为 有界 容器在并发编程领域是众所周知的事情)之外,我还担心此实现中的内存分配.最有可能的是,首先,last 使用的空间将被释放。但是紧接着就需要为value分配新的内存。
我真正想做的是使用分配给last 的内存并将value 的数据复制到这个地方,同时保留顺序。
【问题讨论】:
-
你可以用向量替换你的集合。除非您的数据集很大并且键具有昂贵的副本而没有廉价的移动,否则性能不会受到影响,并且实际上可能会更快,因为向量的动态内存分配比集合少。如果您保持向量排序,则可以在其上使用
std::lower_bound进行 log(n) 搜索。当然,您需要在插入等之前检查向量是否已经包含该值。将这些东西包装在“flat_set”类中。