template<class _Ty,
class _Alloc = allocator<_Ty> >
class vector
: public _Vector_alloc<_Vec_base_types<_Ty, _Alloc> >
答案 0 :(得分:0)
它可能从另一个处理内存分配的类继承。如果该类没有数据成员,则vector
可以从空基优化中受益,而_Vector_alloc
将不会占用任何内存。
如果vector
代替_Vector_alloc allocator;
这样的数据,那么该数据成员总是占用一个字节,即使它是空的,因为C ++要求所有数据成员都有一个不同的地址。
迭代:
对于std::vector
,迭代器基本上是指针的包装器,并且很可能包含指针作为单个数据成员。它具有其他数据成员,以满足http://en.cppreference.com/w/cpp/iterator中定义的所有约束。 (对于std::vector::iterator
,RandomAccessIterator
)
但是,总是应该通过std::vector<T>::iterator::value_type = T
访问其他成员迭代器应该具有的内容(例如std::iterator_traits<It>::value_type
)。这允许原始指针也用作迭代器,因为std::iterator_traits<T*>::value_type = T
由STL定义。因此,指针在技术上已经是连续内存的迭代器。
其他容器的迭代器更复杂。例如,在std:: unordered_map::iterator
中,项目分组在不同的存储桶中。迭代器是一个单独的类,而不是从容器派生的。因为它是一个内部类(在类的名称空间中定义),所以它可以访问容器的私有成员,并且在逻辑上是容器的一部分。
迭代器不是const-correct:std::vector::iterator
总是对它当前指向的项提供非const访问,即使只有const访问迭代器。因此每个容器类包含两个迭代器类:std::vector::iterator
和std::vector::const_iterator
。使用const访问容器时,只能从中获取const_iterator
。