简体   繁体   English

STL容器迭代器和C指针迭代器有什么区别

[英]What is the difference between STL containers iterator and C pointer iterator

i am writing a reverse iterator as a part of my own custom vector class. 我正在编写一个反向迭代器,作为我自己的自定义矢量类的一部分。 Up till now what i have written is as following. 到目前为止,我所写的内容如下。

class MyVector
{
  public:

  typedef T                           value_type;
  typedef value_type*                 pointer;
  typedef const value_type*           const_pointer;
  typedef value_type&                 reference;
  typedef const value_type&           const_reference;
  typedef pointer                     iterator;
  typedef const_pointer               const_iterator;
  typedef size_t                      size_type;

    class reverse_iterator
    {
        private:

        iterator iter;

        public:

        inline reverse_iterator(iterator a=0) : iter(a) {}
        inline reverse_iterator(const reverse_iterator& rev_iter) : iter(rev_iter.iter) {}
        inline reverse_iterator& operator++()
        {
            --iter;
            return *this;
        }
        // and remaining other operator functions
    };

  inline iterator begin (void) { return ((iterator)data_array);           }
  inline iterator end (void)   { return ((iterator)data_array+number_of_elements); }
  inline reverse_iterator      rbegin(void)    { return end()-1;}
  inline reverse_iterator      rend(void)      { return begin()-1;}


    //functions for myvector class 
}; //end of Myvector class

in above class iterater is just C style pointer and reverse_iterator is class. 在上面的类中,iterater只是C风格的指针,而reverse_iterator是类。 So when i do 所以当我做

    main()
    {
        myVector<int> i;
        myVector<int>::reverse_iterator rit= i.begin();
    }

my reverse_iterator is initialised with begin() function and code is compiling and running. 我的reverse_iterator用begin()函数初始化,代码正在编译并运行。 But this does not happen in case of STL's iterator and reverse_iterator. 但这在STL的迭代器和reverse_iterator情况下不会发生。 They prevent such initialisation. 它们阻止了这种初始化。 eg reverse_iterator not allow himself to be initialised with begin() function, it must be initialised with rbegin() . 例如:reverse_iterator不允许使用begin()函数初始化自己,而必须使用rbegin()初始化。

So what should i do to avoid such kind of initialization ?. 那么我该怎么做才能避免这种初始化呢? Should i write a different iterator like which is in STL. 我应该写一个像STL中一样的不同迭代器吗? And i think it is not possible to write it.. Please give me some solution... 而且我认为这是不可能的..请给我一些解决方案...

Iterators and reverse iterators have a few differences. 迭代器和反向迭代器有一些区别。

The most obvious: incrementing each iterator moves them in opposite directions. 最明显的是:增加每个迭代器的方向是相反的。

Less obvious: the return of begin() is not the end of a reverse iterator. 不太明显: begin()的返回不是反向迭代器的结尾。 begin()-1 would be. begin()-1将会是。 Remember that end() represents "one-past-the-end", as C++ ranges are half open, ie [begin, end). 记住end()表示“一个过去”,因为C ++范围是半开的,即[begin,end)。 If you just swap begin() and end() in your reverse iterator then your reverse iterator will have the range (begin, end]. 如果仅在反向迭代器中交换begin()end() ,则反向迭代器将具有范围(开始,结束)。

In other words, there's a reason why STL containers have both begin() and end() and rbegin() and rend() , even if the iterators and reverse iterators themselves might be compatible in some ways. 换句话说,即使迭代器和反向迭代器本身在某些方面兼容,STL容器也具有begin()end()以及rbegin()rend()的原因是有原因的。

To completely prevent conversion from iterator (pointer) to reverse_iterator , make the constructor of reverse_iterator private, and make MyVector a friend of reverse_iterator : 为了完全防止从iterator (指针)到reverse_iterator转换,请将reverse_iterator的构造reverse_iterator MyVector私有,并使MyVector成为reverse_iterator的朋友:

class MyVector
{
  // ...
  class reverse_iterator
  {
  private:
    friend class MyVector;
    reverse_iterator(iterator a=0) : iter(a) {}
    // ...
  };
  // ...
};

If you want that conversion available, but not automatic, then just make the corresponding constructor explicit . 如果您希望该转换可用,但不是自动转换,则只需使相应的构造函数explicit

class MyVector
{
  // ...
  class reverse_iterator
  {
  public:
    explicit reverse_iterator(iterator a=0) : iter(a) {}
    // ...
  };
  // ...
};

In an unrelated note, I also notice that your implementation of rbegin() probably invokes undefined behaviour (I can't tell for sure because it depends on the code initializing data_array ): You are not allowed to decrement the pointer to the beginning of an array. 在不相关的说明中,我还注意到,您对rbegin()可能会调用未定义的行为(我不能确定,因为这取决于初始化data_array的代码):不允许将指针递减到数组。

By the way, the keyword inline is not necessary in your case; 顺便说一句,关键字inline在您的情况下不是必需的。 if you write the member function body inside the class definition, it is automatically inline. 如果您在类定义内编写成员函数主体,则会自动内联。 Of course, the inline doesn't hurt either. 当然, inline也不会有任何伤害。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM