Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有函数请求std::set的容量?_C++_Set - Fatal编程技术网

C++ 是否有函数请求std::set的容量?

C++ 是否有函数请求std::set的容量?,c++,set,C++,Set,对于std::vector,我们可以使用vector::reserve(n)请求向量容量至少足以包含n个元素。那么std::set呢?我们是否有类似的功能来保留其功能?我问这个问题是因为有时,当std::set变量用作来自另一个动态库(使用多线程调试(/MTd))的函数的引用参数时,它是为std::set变量分配足够功能的请求 编辑 一种可能的解决方案可能是使用get_分配器函数: std::set<float> abc; float *p; p = abc.get_

对于
std::vector
,我们可以使用
vector::reserve(n)
请求向量容量至少足以包含n个元素。那么
std::set
呢?我们是否有类似的功能来保留其功能?我问这个问题是因为有时,当std::set变量用作来自另一个动态库(使用多线程调试(/MTd))的函数的引用参数时,它是为std::set变量分配足够功能的请求

编辑

一种可能的解决方案可能是使用get_分配器函数:

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);
std::设置abc;
浮动*p;
p=abc.get_分配器().allocate(100);

对于(int i=0;i使用<代码> STD::vector < /C> >,提供函数给Reave空间是重要的,因为在C++标准中保证向量中的所有元素都是连续的。这意味着,如果您试图“<代码> PuxFuff< <代码> >比当前保留的更多的项目,则需要分配更多的内存,P可能是在另一个地方,可能需要移动现有项目(我认为这是基于实现的)。这一切都需要时间,因此您可以保留(或预先分配)您认为需要的空间

相反,像
std::set
这样的容器通常被实现为一个树。这里的主要区别是元素在添加时通常是动态分配的。不要求项目在内存中是连续的,因此不需要“保留”所述项目的任何空间——根据实现情况,可以根据需要在可用内存中的任何位置进行分配


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

这是不是通过查看而不是在此处发布来解决的?还是您要寻找的是其他内容?我不认为更新中的代码会达到您期望的效果-您正在分配一块内存,但我不相信它会被“分配”到您的集合,该集合将根据需要分配自己的内存。如果它按照您的期望执行操作,那么这是危险的,因为集合仍然认为它有100个有效项。谢谢。我可以找到一个解决方案,就是使用get_allocator()。allocate()函数。我已经重新组织了我的问题。正如我在上面的评论中提到的,我认为这不会达到您的预期。对于集合,我能想到的预分配内存的唯一原因是,如果您需要它是一个特定的位置(例如,嵌入式系统中的映射内存)。在这种情况下,您可能无论如何都需要一个自定义分配器。