【发布时间】:2010-04-25 13:14:35
【问题描述】:
如何限制 STL 向量的 max_size?最终通过专业化。欢迎举个例子。
【问题讨论】:
-
为什么要限制向量的大小?无论如何考虑使用 boost::circular_buffer 或 boost::array。
如何限制 STL 向量的 max_size?最终通过专业化。欢迎举个例子。
【问题讨论】:
这样做的方法是替换分配器。请注意,vector 和 string 是目前唯一实际检查其分配器 max_size 的容器。这个想法是,由于这些容器保证元素存储在连续的内存中,容器会询问分配器分配器可以处理多少元素。
这就是想法
template<class T>
struct MyAllocator:std::allocator<T>
{
template <class U>
struct rebind { typedef MyAllocator<U> other; };
typedef typename std::allocator<T>::size_type size_type;
MyAllocator(size_type sz=1234)
: m_maxsize(sz)
{}
size_type max_size() const { return m_maxsize; }
private:
size_type m_maxsize;
};
然后制作一个新的向量
typedef std::vector<Type,MyAllocator<Type>> vec_t;
vec_t vec(vec_t::allocator_type(4567));
我没有尝试编译这段代码,但它应该可以工作。
【讨论】:
maxsize 的声明。无论如何,无状态分配器更好,所以它应该作为模板参数来实现。
std::vector 中的max_size 不是您可以更改的。这是一个特定于当前向量的常数,它显示了您可以在该向量中放入多少当前类型的元素(我想这取决于您的系统类型)
因此,std::vector<int> 和 std::vector<double> 的 max_size 会有很大差异,因为 int 和 double 不同。
【讨论】: