是否有函数来请求std :: set的功能?

时间:2014-02-21 09:26:15

标签: c++ set

对于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);

1 个答案:

答案 0 :(得分:16)

使用std::vector,为reserve空间提供功能非常重要,因为在C ++标准中保证向量中的所有元素在内存中是连续的。这意味着如果您尝试push_back项目比当前保留的项目多,则需要分配更多内存,可能在不同的位置,并且可能需要移动现有项目(我认为这是基于实现的)。这一切都需要时间,因此您可以预留(或预先分配)您认为需要的空间。

相反,诸如std::set之类的容器通常实现为树。这里的主要区别是元素通常在添加时动态分配。不要求项目在内存中是连续的,因此不需要为所述项目“保留”任何空间 - 取决于实现,它们可以根据需要在可用内存中的任何地方简单地分配。 / p>

不确定这是否是您正在寻找的答案。