list就是一个双向链表 可以o(1)的插入删除操作 但查找数据需要遍历 o(n)
vector因为存储空间是连续的 所以可以使用下标来访问
构造函数
list和vector 都有 无参构造 拷贝构造 n个相同的值构造 一段迭代器区间构造
迭代器
list和vector 都有 正向反向 const
其他成员函数
都有增删改查 判空 swap clear
其中 vector空间不是一个一个增加的 会预先开一部分空间 所以多一个reserve函数 如果知道容量可以直接设置 避免频繁异地扩容
这些都很好实现
其中反向迭代器可以巧妙地复用正向迭代器
template<class Iterator, class ref, class ptr>
class reverse_Iterator
{
public:
typedef reverse_Iterator self;
reverse_Iterator(Iterator _it)
:it(_it)
{}
ref operator*()
{
Iterator tmp = it;
return *(--tmp);
}
ptr operator->()
{
Iterator tmp = it;
return &((--tmp)->data);
}
self& operator++()
{
--it;
return *this;
}
self& operator--()
{
++it;
return *this;
}
self operator++(int)
{
iterator tmp = it;
--it;
return tmp;
}
self operator--(int)
{
iterator tmp = it;
++it;
return tmp;
}
bool operator==(const self& x)
{
return it == x.it;
}
bool operator!=(const self& x)
{
return !(*this == x);
}
private:
Iterator it;
};
只要你传的是list正向迭代器 它就是list反向迭代器 传vector正向迭代器 它就是vector的反向迭代器
迭代器失效问题
在vector的删除中 你当前某个位置的迭代器传入erase后 删除元素 当前迭代器指向的位置的元素已经变成了删除元素的下一个元素 这个迭代器就失效了
在inster中如果发生了异地扩容 这个迭代器也会失效 变成一个野指针
迭代器失效的场景有很多
list中也有诸多类似问题 需要注意
有些情况 如erase 会返回下一个元素的迭代器 可以在删除以后接受以更新这个迭代器