在std :: list中,如何在函数max_size()中计算最大大小?现在我意识到这取决于实现,但我们假设我是制作标准库的人。我如何确定可移植的特定类型list
T
的最大限制?
答案 0 :(得分:2)
它几乎总是N的最大值,其中容器最多可包含N个元素。这几乎总是意味着所讨论的平台上无符号整数类型的最大值除以要存储在容器中的元素类型的大小。
答案 1 :(得分:1)
这个想法是,STL 列表容器默认使用 std::allocator 作为分配器对象。并且,根据作为模板参数(类型)传递的类型,std::allocator 的 max_size() 方法将返回一个数字,该数字表示它可以分配的该传递类型的最大对象数。 List 应该为节点分配内存,这就是为什么你应该将节点结构作为模板参数传递:
struct node {
int data;
node *next;
node *prev;
}
std::allocator<node_struct> A;
std::cout << A.max_size();
,这将打印它可以分配的最大节点数(而不是字节数)。
如何实施:
namespace test {
template <typename T, typename A = std::allocator<T>>
class list {
private:
struct node {
T data;
node *next;
node *prev;
}
using node_allocator = typename std::allocator_traits<A>::template rebind_alloc<node>;
node_allocator allocator;
//...
public:
//...
void max_size() { return allocator.max_size(); }
//...
};
}
希望有帮助!
答案 2 :(得分:0)
它通常类似于
numeric_limits<size_type>::max();
因为这是集合强加的唯一限制,而不是平台。该集合仅对其自身负责,因此即使它可以计算类似于系统的最大内存之类的东西,它仍将仅返回它所施加的限制。
答案 3 :(得分:0)
根据标准 - 这是最大容器的大小。该函数也必须具有恒定的复杂性。
从当前的C ++标准: size_type distance(begin(),end())为最大可能容器