C++实现array迭代器

迭代器简述

迭代器是容器类(如数组,链表,队列,栈等)提供的、用于遍历和访问容器内对象的辅助类。在本题中,我们考虑一种简化的迭代器,它为我们自定义的整型数组类提供元素的遍历和访问。

迭代器的功能架构

自定义的整型数组类MyArray和内部类Iterator模板如下:

class MyArray {
    int * arr;
    int size;
public:
    class Iterator{
        ...
    public:
        ...
        bool get(int &value) const;
        bool put(int value);
        ...
    };
public:
    MyArray(int size);
    ~MyArray();
    Iterator begin();
    Iterator end();
}

MyArray类给出两个接口Iterator begin()和Iterator end()来提供两个特殊的迭代器对象。

  • Iterator begin():返回的迭代器对象,指向数组的第一个元素arr[0]
  • Iterator end():返回的迭代器对象,指向数组arr的末尾,但不是任何数组中的元素
//遍历容器中每个元素
for(MyArray::Iterator iter = ma.begin(); iter != ma.end(); iter++){
    int v;
    iter.get(v);
    ...
}
//通过判断迭代器iter是不是迭代到了容器的末尾,让整个遍历可以结束。

每个迭代器对象都提供两个接口bool get(int &value)和bool put(int value)

  • bool get(int &value):获取当前迭代器所指向的元素。如果迭代器位于一个合法的位置:arr[0]~arr[size-1],则通过value返回对应元素,返回值为true;否则不改变value的值,返回false
  • bool put(int value):向迭代器指向的元素存放值value。如果迭代器位于一个合法的位置:arr[0]~arr[size-1],则将对应数组元素的值更新为value,返回true;否则不改变任何值,返回false
//下列代码中iter.get(v)获取的应该是ma.arr[0]的值
MyArray ma(10);
MyArray::Iterator iter = ma.begin();
iter.put(20); // true, set ma.arr[0]=20
int v = -1;
iter.get(v); // true, v=20

为了使迭代器更加方便使用,我们需要为其重载一些操作符,它们的含义如下:

  • operator++: 将迭代器指向数组中下一个相邻元素(考虑前置和后置)
  • operator–: 将迭代器指向数组中上一个相邻元素(考虑前置和后置)
  • operator==: 判断两个迭代器是否指向同一个位置(元素)
  • operator!=: 与上一个操作符相反的语义
  • operator+(int len): 将迭代器移动到当前元素向后的第len个元素
  • operator-(int len): 将迭代器移动到当前元素向前的第len个元素

添加相应的构造和析构函数。当MyArray对象析构后,它的迭代器执行put和get函数时返回值为false。

迭代器的功能实现切片

类成员和成员函数

在Iterator的构造函数中传入MyArray的成员,实现了迭代器对MyArray的访问。同时,如果MyArray调用析构函数,则size = 0通过指针传给Iterator,使得迭代器调用put和get函数返回false。

class MyArray{
  int * arr;
  int size;
public:
  class Iterator{
    int* iter;
    int temp_position;
    int* array_size;
  public:
    Iterator(int* arr, int n,int* size);
    int* begin();
    int* end();
    bool get(int & value) const;
    bool put(int value);
    Iterator& operator ++ ();
    const Iterator operator ++(int);
    Iterator& operator --();
    const Iterator operator --(int);
    bool operator ==(const Iterator& iter2) const;
    bool operator != (const Iterator& iter2) const;
    Iterator operator + (int len);
    Iterator operator - (int len);
  };

public:
  MyArray(int sz);
  ~MyArray();
  Iterator begin();
  Iterator end();
};

接口Iterator begin()和Iterator end()

Iterator begin(){
    Iterator it(arr, 0, &size);
    return it;
}
Iterator end(){
    Iterator it(arr, size, &size);
    return it;
}

接口bool get(int &value)和bool put(int value)

bool MyArray::Iterator::get(int& value) const{
  if(temp_position < 0 || temp_position >= *array_size)
    return false;
  value = *iter;
  return true;
}

bool MyArray::Iterator::put(int value){
  if(temp_position < 0 || temp_position >= *array_size)
    return false;
  *iter = value;
  return true;
}

操作符重载

注意到operator++/–前置和后置具有不同语义。

Iterator& operator ++ (){
  iter = iter + 1;
    temp_position ++;
    return *this;
}
const Iterator operator ++(int){
    Iterator temp = *this;
    ++(*this);
    return temp;
}
Iterator& operator --(){
  iter = iter - 1;
  temp_position --;
  return *this;
}
const Iterator operator --(int){
  Iterator temp = *this;
  --(*this);
  return temp;
}
bool operator ==(const Iterator& iter2) const{
  return iter2.iter == iter;
}
bool operator != (const Iterator& iter2) const{
  return iter2.iter != iter;
}
Iterator operator + (int len){
  int* arr = iter-temp_position;
  Iterator new_iter(arr, temp_position+len, array_size);
  return new_iter;
}
Iterator operator - (int len){
  int* arr = iter-temp_position;
  Iterator new_iter(arr, temp_position-len, array_size);
  return new_iter;
}

整体代码实现

#include<iostream>
using namespace std;

class MyArray{
  int * arr;
  int size;
public:
  class Iterator{
    int* iter;
    int temp_position;
    int* array_size;
  public:
    Iterator(int* arr, int n,int* size);
    int* begin();
    int* end();
    bool get(int & value) const;
    bool put(int value);
    Iterator& operator ++ (){
      iter = iter + 1;
      temp_position ++;
      return *this;
    }
    const Iterator operator ++(int){
      Iterator temp = *this;
      ++(*this);
      return temp;
    }
    Iterator& operator --(){
      iter = iter - 1;
      temp_position --;
      return *this;
    }
    const Iterator operator --(int){
      Iterator temp = *this;
      --(*this);
      return temp;
    }
    bool operator ==(const Iterator& iter2) const{
      return iter2.iter == iter;
    }
    bool operator != (const Iterator& iter2) const{
      return iter2.iter != iter;
    }
    Iterator operator + (int len){
      int* arr = iter-temp_position;
      Iterator new_iter(arr, temp_position+len, array_size);
      return new_iter;
    }
    Iterator operator - (int len){
      int* arr = iter-temp_position;
      Iterator new_iter(arr, temp_position-len, array_size);
      return new_iter;
    }
  };

public:
  MyArray(int sz);
  ~MyArray();
  Iterator begin(){
    Iterator it(arr, 0, &size);
    return it;
  };
  Iterator end(){
    Iterator it(arr, size, &size);
    return it;
  };

};

MyArray::MyArray(int sz){
  size = sz;
  arr = new int[sz];
}

MyArray::~MyArray(){
  delete []arr;
  size = 0;
}

MyArray::Iterator::Iterator(int* arr, int n, int* size){
  iter = arr + n;
  temp_position = n;
  array_size = size;
}

bool MyArray::Iterator::get(int& value) const{
  if(temp_position < 0 || temp_position >= *array_size)
    return false;
  value = *iter;
  return true;
}

bool MyArray::Iterator::put(int value){
  if(temp_position < 0 || temp_position >= *array_size)
    return false;
  *iter = value;
  return true;
}
/*测试样例
int main(){
  MyArray ma(10);
  for(MyArray::Iterator iter = ma.begin(); iter != ma.end(); iter ++){
    int v;
    cin >> v;
    iter.put(v);
  }
  for(MyArray::Iterator iter = ma.begin(); iter != ma.end(); iter = iter + 1){
    int v;
    iter.get(v);
    cout << v << " ";
  }
  cout << endl;
  system("pause");
  return 0;
}*/
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值