为什么迭代器类型与向量容器中的value_type *不匹配?

时间:2014-03-03 06:29:41

标签: c++ vector stl

根据最新的STL源代码,我可以在stl_vector.h中找到以下内容

template <class _Tp, class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >
class vector : protected _Vector_base<_Tp, _Alloc>   
{
private:
  typedef _Vector_base<_Tp, _Alloc> _Base;
public:
  typedef _Tp value_type;
  typedef value_type* pointer;
  typedef const value_type* const_pointer;
  typedef value_type* iterator;
  typedef const value_type* const_iterator;
  typedef value_type& reference;
  typedef const value_type& const_reference;
  typedef size_t size_type;
  typedef ptrdiff_t difference_type;
...

int main() {
vector<string>::iterator it;

cout << "iterator type check 1 " << (typeid(it) == typeid(string *)) << endl;
cout << "iterator type check 2" << (typeid(vector<string>::iterator) == typeid(vector<string>::value_type *)) << endl;
cout << "iterator type check 3" << (typeid(vector<string>::pointer) == typeid(vector<string>::value_type *)) << endl;
cout << "iterator type check 4" << (typeid(string *) == typeid(vector<string>::value_type *)) << endl;

}

但是,当我使用clang ++编译上面的main时,我得到了iterator和value_type *的不匹配结果。 结果是1/2不匹配,3/4匹配。但是,我预计1/2也应该匹配。 这是因为我指的是最新的stl代码吗?

1 个答案:

答案 0 :(得分:1)

STL不是C ++标准库。 C ++标准允许实现使用指针作为随机访问迭代器,但不指示它。 clang和gcc都为这些迭代器使用用户定义的类型,而不是指针。海湾合作委员会也不是。

您需要查看实际尝试编译的代码的实现。那不是STL。

例如,在gcc 4.8上std::vector::iterator

typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;

其中__normal_iterator是一个类模板。