动态数组迭代器
知识点:
动态数组(根据存入数据的多少自动扩容的数组);
迭代器[注:动态数组在进行删除和插入的时候尾部迭代器可能会失效]
代码上已经附上注释!
关于动态数组后面会仔细写一篇文章!
C++提供的这几个库里面都有标准的迭代器:
#include // C++字符串库
#include // C++ 列表库
#include // C++ 动态数组库
#include
#include <iostream>
/// <summary>
/// 动态数组迭代器
/// </summary>
namespace
{
//typedef void* Vode;
class myvector
{
private:
int _len;
int _maxLen;
int* _pArr;
public:
myvector()
{
_len = -1;
_maxLen = 3;
_pArr = new int[_maxLen];
}
myvector(myvector& v)
{
_len = v._len;
_maxLen = v._maxLen;
_pArr = new int[_maxLen];
memcpy(_pArr, v._pArr, sizeof(int) * (_len + 1));
}
~myvector()
{
delete[] _pArr;
}
void push_back(int v)
{
if ((_len + 1) >= _maxLen)
{
_maxLen = 2 * _maxLen;
int* p = new int[_maxLen];
memcpy(p, _pArr, sizeof(void*) * (_len + 1));
delete[] _pArr;
_pArr = p;
}
//_len 默认为-1
_len++;
_pArr[_len] = v;
}
public:
//迭代器内部不保证数据是否越界
class iterator
{
friend class myvector;
private:
int _index;
int* _pArr;
public:
/// <summary>
/// 构造函数
/// </summary>
/// <param name="_pArr">数据位置</param>
/// <param name="_index">当前数据的索引</param>
iterator(int* pArr, int index)
{
_pArr = pArr;
_index = index;
}
//重写前置++
iterator& operator++()
{
++_index;
return *this;
}
//重写!=
bool operator!=(const iterator& it)
{
return _index != it._index;
}
//访问当前位置的数据成员
int& operator*()
{
return _pArr[_index];
}
};
public:
//第一个元素
iterator begin()
{
return iterator(_pArr, 0);
}
//最后一个元素的下一个位置
iterator end()
{
return iterator(_pArr, _len + 1);
}
/// <summary>
/// 返回下一个迭代器的位置
/// </summary>
/// <param name="it">迭代器</param>
/// <returns></returns>
iterator erase(const iterator& it)
{
//输出是把整体的位置往前移动
for (int i = it._index; i < _len; i++)
{
_pArr[i] = _pArr[i + 1];
}
--_len;
return it;
}
};
}
//尾部迭代器(倒叙迭代器)执行最后一个元素
//std::vector<int>::reverse_iterator revIt = vec.rbegin();
//下一个元素也是++
//end 为第一个元素的上一个元素
//vec.rend();
//begin为最后一个元素
//vec.rbegin();
//头部位置 index=0;
//第一条数据 index=1;
int main8002933()
{
myvector v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
//动态数组迭代器再插入数据或删除数据时,可能会导致迭代器失效
//v.erase(v.begin());
//v.erase(v.begin());
//v.erase(v.begin());
//删除完begin后需要重新获取begin
//std::cout << *begin << std::endl;
//std::cout << *end << std::endl;
myvector::iterator begin = v.begin();
myvector::iterator end = v.end();
std::cout << "=====\n";
for (; begin != end; ++begin)
std::cout << *begin << std::endl;
return 0;
}