vector类有一个继承层次结构。任何人都能解释一下吗?

时间:2016-04-10 19:19:39

标签: vector stl

template<class _Ty,
    class _Alloc = allocator<_Ty> >
    class vector
        : public _Vector_alloc<_Vec_base_types<_Ty, _Alloc> >

1 个答案:

答案 0 :(得分:0)

它可能从另一个处理内存分配的类继承。如果该类没有数据成员,则vector可以从空基优化中受益,而_Vector_alloc将不会占用任何内存。

如果vector代替_Vector_alloc allocator;这样的数据,那么该数据成员总是占用一个字节,即使它是空的,因为C ++要求所有数据成员都有一个不同的地址。

迭代:

对于std::vector,迭代器基本上是指针的包装器,并且很可能包含指针作为单个数据成员。它具有其他数据成员,以满足http://en.cppreference.com/w/cpp/iterator中定义的所有约束。 (对于std::vector::iteratorRandomAccessIterator

的情况

但是,总是应该通过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::iteratorstd::vector::const_iterator。使用const访问容器时,只能从中获取const_iterator