学习C++我们必然要接触到两个库,STL库和Boost库。
Boost库是C++中一个功能强大涵盖算法、泛型编程、容器等免费开源的一个外部库。这里不谈
STL是C++标准模板库,涵盖六大组件:容器、迭代器、空间配置器、算法、适配器。这篇文章主要了解STL常见容器实现和接口的使用。
一、vector
vector是一个动态增容的顺序表,当顺序表容量到达上限时,系统会重新开辟一块更大的连续内存,然后把原来的内容依次拷贝下去。
优点:连续存储,支持下标访问,尾删尾插方便。
缺点:扩容是系统开销大,中间位置插入数据时系统开销大。
常用接口:
1.insert()
insert一共有三个重载函数
single element (1)
iterator insert (iterator position, const value_type& val);//pos 位置前插入val
fill (2)
void insert (iterator position, size_type n, const value_type& val);//pos位置前插入n个val
range (3)
template <class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last);//pos前插入一段区间的值
2.operator[]
index位置访问
3.erase()
删除元素和删除一段区间
4.resize()
改变容量
5.push_back、pop_back
因为头插头删效率差,只提供尾插尾删接口
void TestVector()
{
vector<int> v;
vector<int>::iterator it;//迭代器
v.resize(5);
//支持开区间
it = v.begin();
v.insert(it,3,7);//it前面插入3个7
for (it = v.begin(); it !=v.end(); )
it=v.erase(it++);//删除it位置的数
//cout << v.size() << endl;
cout<<v[0]<<endl;
v.resize(10);
cout<<v.size()<<endl;
cout << v.capacity() << endl;
v.reserve(8);
cout << v.size() << endl;
cout << v.capacity() << endl;
}
注意:
<1>.insert、erase存在迭代器失效问题,所以删除或者插入的时候应该接受返回值(下一个位置的迭代器),以免迭代器失效
标准的删除
for (it = v.begin(); it !=v.end(); )
it=v.erase(it++);//删除it位置的数
<2>.resize和reserve的区别:
resize重新分配size 分配capacity,reserve只开辟预留空间,capacity改了,size没变
<3>.at和operator[]区别:
at有越界检测,operator[]没有越界检测。
二、list
关于list是STL库中的一个链式存储容器,数据结构为双向循环链表
优点:链式存储,任意一个位置插入和删除都是容易的
缺点:不支持随机位置的访问
常用接口:
1.构造函数
list() 声明一个空列表;
list(n) 声明一个有n个元素的列表,每个元素都是由其默认构造函数T()构造出来的
list(n,val) 声明一个由n个元素的列表,每个元素都是由其复制构造函数T(val)得来的
list(n,val) 声明一个和上面一样的列表
list(first,last) 声明一个列表,其元素的初始值来源于由区间所指定的序列中的元素
2.begin()/end()
迭代器的一段左开右闭区间
3.push_back、push_front、pop_back、pop_front
头插尾插,头删尾删
4.empty()判断为空
5.size()节点个数
6.resize()重新非配大小
7.reverse()逆置
8.sort()排序
9.clear()清空
10.unique() 元素去重
void TestList()
{
list<string> l;
list<string>::iterator it;
l.push_back("up");
l.push_back("down");
l.push_back("left");
l.push_back("right");
l.push_back("right");
/*for ( it = l.begin(); it != l.end(); ++it)
cout << *it << " ";*/
for_each(l.begin(), l.end(),print);//每个都执行print函数
cout << endl;
l.sort();//排序
l.unique();//去重
cout<<l.size()<<endl;//求大小
for (it = l.begin(); it != l.end(); ++it)
cout << *it << " ";
}