对于std::vector
,我们可以使用vector::reserve(n)
来请求向量容量至少足以包含n个元素。那么std::set
呢?我们是否有类似的功能来保留其能力?我问这个问题是因为有时它是一个请求为std :: set变量分配足够的功能,当它被用作函数的引用参数时,它来自另一个动态库(使用多线程调试(/ MTd)) )。
修改
一种可能的解决方案可能是使用get_allocator函数:
std::set<float> abc;
float *p;
p = abc.get_allocator().allocate(100);
for(int i=0; i<100; i++)
abc.insert(abc.end(),i);
std::set<float>::iterator it = abc.begin();
std::set<float>::iterator itEnd = abc.end();
while(it != itEnd)
{
std::cout<<(*it)<<std::endl;
it++;
}
abc.get_allocator().deallocate(p,100);
答案 0 :(得分:16)
使用std::vector
,为reserve
空间提供功能非常重要,因为在C ++标准中保证向量中的所有元素在内存中是连续的。这意味着如果您尝试push_back
项目比当前保留的项目多,则需要分配更多内存,可能在不同的位置,并且可能需要移动现有项目(我认为这是基于实现的)。这一切都需要时间,因此您可以预留(或预先分配)您认为需要的空间。
相反,诸如std::set
之类的容器通常实现为树。这里的主要区别是元素通常在添加时动态分配。不要求项目在内存中是连续的,因此不需要为所述项目“保留”任何空间 - 取决于实现,它们可以根据需要在可用内存中的任何地方简单地分配。 / p>
不确定这是否是您正在寻找的答案。