STL是高效的C++程序库,是大量类模板和函数模板的聚集,主要的组成部分包括容器、迭代器、算法、函数等。其中容器是存放对象的集合,使用类模板方式; 选代器是容器与算法的粘合剂,是所谓的泛型指针, 使用类模板方式,迭代器提供了访问容器中对象的方法,其实质是容器中对象的指针;而算法则为操作集合数据的通用算法, 也使用函数模板方式。这种巧妙的方法, 让我们在使用容器管理对象时非常方便。
请查阅相在资料,解决如下问题:
1、如何实现一个类似于vector的容器myVector, 该容器能像vector一样可以实例化为存放某种数据数据的数据,并能对数据提供基本的管理, 如插入数据、删除某指定的数据、可以动态扩容、可以删除全部数据等。
2、如何实现一个与之相匹配的迭代器myliterator,该迭代器能像vector的迭代器一样,可以用它来遍历或操作访问myVector中的对象。
//使用结构体存储迭代器指针
struct myIterator
{
T* p;
myIterator()
{
p = nullptr;
}
//重载赋值运算符
myIterator& operator =(myIterator const& srcIt)
{
p = srcIt.p;
return *this;
}
//重载指针运算符
T operator *()
{
return *p;
}
//重载后置++
myIterator& operator ++(int)
{
p++;
return *this;
}
//重载+运算符
myIterator operator +(int n)
{
p += n;
return *this;
}
//重载-运算符,返回两指针之间的元素的个数
int operator -(myIterator const& srcIt)
{
return p - srcIt.p;
}
//重载不等于运算符
bool operator !=(myIterator const& srcIt)
{
return p != srcIt.p ? true : false;
}
};
//在容器后端增加元素
void myPush_back(const T& d)
{
//容量不足时需要扩容
if (curpos >= length)
{
length = length * 2 + 1;
T* temp = new T[length];
memcpy(temp, data, sizeof(T) * curpos);
if (data) {
delete[] data;
}
data = temp;
}
data[curpos] = d;
curpos++;
}
//在容器末尾删除元素
void myPop_back()
{
assert(curpos > 0);//assert函数的作用是,如果它的条件返回错误,则终止程序执行
curpos--;
}
三、代码测试及结果
#include "myvector.h"
int main()
{
//创建两个容器
myVectorv1;
myVectorv2;
//添加元素
v1.myPush_back(1);
v1.myPush_back(2);
v2.myPush_back(4);
v2.myPush_back(5);
//迭代器遍历容器
myVector::myIterator it1;
cout << "v1:" << "t";
for (it1 = v1.myBegin(); it1 != v1.myEnd(); it1++)
{
cout << *it1 << "t";
}
cout << endl;
myVector::myIterator it2;
cout << "v2:" << "t";
for (it2 = v2.myBegin(); it2 != v2.myEnd(); it2++)
{
cout << *it2 << "t";
}
cout << endl;
//插入元素
it1 = v1.myEnd() + 1;
v1.myInsert(it1, 3);
it2 = v2.myEnd() + 1;
v2.myInsert(it2, 6);
//交换元素
v1.mySwap(v2);
cout << "交换后:" << endl;
cout << "v1:" << "t";
for (it1 = v1.myBegin(); it1 != v1.myEnd(); it1++)
{
cout << *it1 << "t";
}
cout << endl;
cout << "v2:" << "t";
for (it2 = v2.myBegin(); it2 != v2.myEnd(); it2++)
{
cout << *it2 << "t";
}
cout << endl;
//其他部分函数测试
cout << "v1的元素个数:" << v1.size() <<"t" << "v2的末尾元素:" << v2.myBack() << endl;
//拷贝构造
myVectorv3(v1);
cout << "v3:"<<"t";
myVector::myIterator it3;
for (it3 = v3.myBegin(); it3 != v3.myEnd(); it3++)
{
cout << *it3 << "t";
}
cout << endl;
//删除元素
it3 = v3.myBegin()+1;
v3.myErase(it3);
v3.myPop_back();
cout << "v3:" << "t";
for (it3 = v3.myBegin(); it3 != v3.myEnd(); it3++)
{
cout << *it3 << "t";
}
cout << endl;
//清空容器
v3.myClear();
cout << "v3是否为空:" << v3.isEmpty() << endl;
return 0;
}
由于代码太多,篇幅有限,需要自取:
C++课程小作业-STL容器与迭代器的实现路径-设计类vector容器myVector



