C++ STL库中vector/list使用

学习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 << "  ";

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值