list是STL提供的一个线性链表的数据结构,其与vector的差异,类似于链表与数组的差异。
数组:可以随机读取访问,但是要插入和删除指定元素时不容易处理,因为在扩展或缩小数组空间时,对应的其他数组元素的位置会受到影响。
链表:不能够随机读取访问,但是插入和删除元素时较数组要方便很多,以双向线性链表为例,每个节点都通过前驱指针和后驱指针与前后元素保持访问关系,插入和删除元素时只涉及到最多三个元素的属性修改(即前、后、待插入删除的三个元素),不会对其他所有的元素产生影响。
使用示例如下:
#include <iostream>
#include <list>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
list<string> strList;
strList.push_back("nihao");
strList.push_back("dajiahao");
// 与vector相比较,这里多添加了push_front成员接口
strList.push_front("beijing");
strList.push_front("shanghai");
// 遍历list容器中的所有元素
for (list<string>::iterator iterStrList = strList.begin(); iterStrList != strList.end(); iterStrList++)
{
cout << *iterStrList << endl;
}
// 向list容器中插入指定元素, 需要使用指定的迭代器来指明插入位置,然后将在该迭代器指向的元素之前进行插入
strList.insert(strList.begin(), "guangzhou");
strList.insert(++strList.begin(), "shenzhen");
for (list<string>::iterator iterStrList = strList.begin(); iterStrList != strList.end(); iterStrList++)
{
cout << *iterStrList << endl;
}
// 使用remove()从list容器中删除元素
strList.remove("nihao");
for (list<string>::iterator iterStrList = strList.begin(); iterStrList != strList.end(); iterStrList++)
{
cout << *iterStrList << endl;
}
// 使用erase()从list
list<string>::iterator iterDel;
for (list<string>::iterator iterStrList = strList.begin(); iterStrList != strList.end(); iterStrList++)
{
if (*iterStrList == "guangzhou")
{
iterDel = iterStrList;
}
}
strList.erase(iterDel);
for (list<string>::iterator iterStrList = strList.begin(); iterStrList != strList.end(); iterStrList++)
{
cout << *iterStrList << endl;
}
// 注:对于list而言使用remove成员函数和erase成员函数都可以释放指定节点,
// 但是对于vector而言,如果使用algorithm中的remove函数,则其与自身erase成员函数存在明显不同,使用remove只是将不等于指定val的元素前移,但不会真正删除,需要与erase配合使用
vector<int> numTest;
numTest.push_back(1);
numTest.push_back(2);
numTest.push_back(3);
numTest.push_back(2);
numTest.push_back(1);
vector<int>::iterator iterNumTest;
// 这种指定迭代器区间的,一般是前闭后开,即从begin到end的前一个元素
iterNumTest = remove(numTest.begin(), numTest.end(), 2);
for (vector<int>::iterator iterNum= numTest.begin(); iterNum != numTest.end(); iterNum++)
{
cout << *iterNum << endl;
}
numTest.erase(iterNumTest, numTest.end());
for (vector<int>::iterator iterNum = numTest.begin(); iterNum != numTest.end(); iterNum++)
{
cout << *iterNum << endl;
}
// 同样可以使用find函数来查找容器中指定的元素,常用的algorithm中函数有sort(排序),unique(去重),find(查找)等
system("pause");
return 0;
}