STL—-标准模板库:1.可复用的组件库
2.包罗算法和数据结构的软件框架
STL的六大组件
1.容器—-各种数据结构
2.迭代器—-扮演容器和算法的胶合剂
↓
区间:左闭右开,不支持比较大小。迭代器是单参数的构造函数
3.空间配置器—-负责内存空间的分配与管理
4.配置器—-一种修饰容器或者仿函数或者迭代器接口的东西
5.算法—-各种常见算法(sort,search,copy等)#include
6.仿函数(行为类似函数的类,用作算法的某种策略)
迭代器vector和list
将顺序表和链表整合成模板,便于使用。
迭代器相当于指针。
vector—-没有头插、头删
vector遍历输出通过迭代器begin和end实现,且可以根据一定条件输出。
void test2()
{
vectorv;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
v.push_back(6);
vector::iterator it1 = v.begin();
while (it1!=v.end())//遍历顺序表
{
cout << *it1 << " ";
++it1;
}
cout << endl;
vector<int>::iterator it3 = v.begin();
while (it3!=v.end())
{
if (*it3 % 2 == 0)//输出偶数
{
cout << *it3 << " ";
}
++it3;
}
cout << endl;
}
vector也有erase删除指定位置的元素。
void test3()
{
vectorv;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
v.push_back(6);
vector::iterator pos = find(v.begin(), v.end(), 2);//通过find找到pos位置然后删除
v.erase(pos);
//v.erase(v.begin() + 2);//删除指定位置的元素
vector::iterator it1 = v.begin();
while (it1!=v.end())
{
cout << *it1 << ” “;
++it1;
}
cout << endl;
}
反向迭代器,vector也提供逆向输出迭代器rbegin(),rend()
void test2()
{
vectorv;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
v.push_back(6);
vector::reverse_iterator it1 = v.rbegin();
while (it1!=v.rend())//遍历顺序表
{
cout << *it1 << " ";
++it1;
}
cout << endl;
vector<int>::reverse_iterator it3 = v.rbegin();
while (it3!=v.rend())
{
if (*it3 % 2 == 0)//输出偶数
{
cout << *it3 << " ";
}
++it3;
}
cout << endl;
}
vector中也提供const类型的迭代器,比如cbegin(),cend(),crbegin(),crend()
vector的插入元素和计算size值大小
void test4()
{
vectorv;
for (size_t i = 1; i < 6; i++)
{
v.push_back(i);
}
cout << “v.size()” << v.size() << endl;//输出顺序表元素个数
v.insert(v.begin()+2, 100);//插入元素
cout << “v.size()” << v.size() << endl;
vector::iterator it1 = v.begin();
while (it1 != v.end())
{
cout << *it1 << ” “;
++it1;
}
cout << endl;
}
…
但是vector在增容时有代价大的缺点。
list—链表
链表的迭代器—-指针 4种+2种
重载“->”,像指针一样
重载“*”,是返回T&;
重载“->”,是返回T&;it2.operator->()->_a1;
self&operator++() 前置++
self&operator++(int) 后置++
迭代器拷贝构造函数是浅拷贝也可以,并不影响释放的问题。
“*”、“->”不光负责读数据,也支持修改数据。
后插入元素、前插入元素、后删、前删。
void listtest()
{
listl;
l.push_back(1);
l.push_back(2);
l.push_back(3);
l.push_back(4);
l.push_back(5);
list::iterator it1 = l.begin();
while (it1 != l.end())
{
cout << *it1 << ” “;
++it1;
}
cout << endl;
l.push_front(6);
list::iterator it2 = l.begin();
while (it2 != l.end())
{
cout << *it2 << ” “;
++it2;
}
cout << endl;
l.pop_back();
l.pop_front();
list::iterator it3 = l.begin();
while (it3 != l.end())
{
cout << *it3 << ” “;
++it3;
}
cout << endl;
}
反向迭代器同vector
迭代器失效
void listtest()//迭代器失效
{
listl;
for (size_t i = 1; i < 6; i++)
{
l.push_back(i);
}
list::iterator it1 = l.begin();
while (it1 != l.end())
{
if (*it1 % 2 == 0)
{
l.erase(it1);//如果直接删除it1,就会使程序崩溃,因为会产生野指针,找不到下一个元素,即找不到_next,从而产生错误
}
cout << *it1 << ” “;
++it1;
}
cout << endl;
}
改正如下:
void listtest()//迭代器失效
{
listl;
for (size_t i = 1; i < 6; i++)
{
l.push_back(i);
}
list::iterator it1 = l.begin();
while (it1 != l.end())
{
if (*it1 % 2 == 0)
{
//list::iterator tmp = –it1;
it1=l.erase(it1);
}
else
{
++it1;
}
}
list::iterator it2 = l.begin();
while (it2 != l.end())
{
cout << *it2 << ” “;
++it2;
}
cout << endl;
}
list与vector迭代器的使用在很多方面是相似的。