如何将std :: vector的容量限制为元素的数量

时间:2016-07-18 08:46:35

标签: c++ c++11 memory memory-management vector

我的程序使用569MB内存,只需要500MB, 我有很多不同大小的std :: vector 有没有办法将容量设置为元素数量以避免内存开销。 (我不是关于表现的事情,记忆是关键)

4 个答案:

答案 0 :(得分:4)

  

如何将std :: vector的容量限制为元素数

您可以做的最好的事情是在添加元素之前保留所需的空间。这也应该具有最佳性能,因为它没有重新分配和复制。

如果这不切实际,那么您可以在添加元素后使用std::vector::shrink_to_fit()。当然,如果分配可能永远不会达到设定限制以上,那对我们没有帮助。

从技术上讲,这些方法都不能通过标准来保证容量与大小相匹配。您依赖于标准库实现的行为。

答案 1 :(得分:2)

您可能正在寻找shrink_to_fit方法,请参阅http://en.cppreference.com/w/cpp/container/vector/shrink_to_fit

或者,如果你不能/允许使用C ++ 11,你可能想要使用swap-to-fit习语:https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Shrink-to-fit

在C ++ 11中(注意编译器可能会忽略shrink_to_fit):

vector<int> v;
// ... 
v.shrink_to_fit();

交换适合的习语:

vector<int> v;
// ...
vector<int>( v ).swap(v);
// v is swapped with its temporary copy, which is capacity optimal

答案 2 :(得分:2)

在向其推送任何内容之前写一些包装器和控件大小,或者使用固定大小的std :: array而不是

答案 3 :(得分:0)

您可以使用自定义分配器并提供模板参数所需的容量。修改此线程中的示例: Compelling examples of custom C++ allocators?

#include <memory>
#include <iostream>
#include <vector>
namespace my_allocator_namespace
{
    template <typename T, size_t capacity_limit>
    class my_allocator: public std::allocator<T>
    {
    public:
        typedef size_t size_type;
        typedef T* pointer;
        typedef const T* const_pointer;

        template<typename _Tp1 >
        struct rebind
        {
            typedef my_allocator<_Tp1 , capacity_limit> other;
        };

        pointer allocate(size_type n, const void *hint=0)
        {
            if( n  > capacity_limit ) {
                return std::allocator<T>::allocate(capacity_limit ); 
            }
            return std::allocator<T>::allocate(n, hint);
        }

        void deallocate(pointer p, size_type n)
        {
            return std::allocator<T>::deallocate(p, n);
        }

        my_allocator() throw(): std::allocator<T>() {  }
        my_allocator(const my_allocator &a) throw(): std::allocator<T>(a) { }
        template <class U,size_t N>                    
        my_allocator(const my_allocator<U,N> &a) throw(): std::allocator<T>(a) { }
        ~my_allocator() throw() { }
    };
}
using namespace std;
using namespace my_allocator_namespace;
int main(){
vector<int, my_allocator<int,20> > int_vec(10);
    for(int i = 0 ;i < 20; i++)
    {
        std::cerr << i << "," << int_vec.size() << std::endl;
        int_vec.push_back(i);
    }
}
然而,

应该谨慎访问超出范围的指数