复习C++系列---STL之Vector

1.什么是STL

  STL(Standard Template Library)标准模板库的简称,是由惠普开发的一系列软件的总称,STL现在是C++的一部分,已经被构建于编译系统之内,所以不需要再引入。

2.STL的组成部分

  • 容器(containers):是一种数据结构容器,使用类模板的方式提供,我们可以方便的进行数据的存储操作。
  • 适配器(adapters):以序列式容器为基础,提供的栈,队列和优先级队列的这种容器。
  • 迭代器(iterators):类似于指针,用来操作容器的对象。
  • 算法(algorithm):包含一系列的常见算法。
  • 空间配置器(allocator):其中主要工作包括两部分:1,对象的创建与销毁。2,内存的创建与释放。
  • 仿函数(functor):仿函数又称为函数对象,其实就是重载了()操作符的struct,没有什么特别的地方。

二,STL的容器

1,序列式容器

  • 每个元素都有固定位置,取决于插入时机和地点。与元素值无关。
  • vector(向量):底层数据结构是数组,可以随机存取数据元素(用索引直接存取),数组的尾部添加和移除元素很快,但在头部和中部插入元素比较耗时。
  • deque(双端队列):底层数据结构是数组,可以随机存取数据元素,在数组的头部和尾部插入和删除元素很快。
  • list(列表):底层数据结构是双向链表,不提供随机存取数据元素(需要按顺序走到要存取的元素),在任何位置插入和删除都很快,只需要简单的移动一下指针。

2,关联式容器

  • 元素位置取决于特定的排序准则,和插入的顺序无关,底层数据结构为二叉树。
  • set(集合):内部元素依据其值自动排序,set内相同的数值元素只能出现一次。
  • multiset(多重集合):内部元素依据其值自动排序,set内允许出现重复的元素。
  • map(映射):map的元素是成对的键值对,内部元素的值依据键自动排序,键只允许出现一次。
  • multimap(多重映射):多重映射是map的增强版,允许键出现多次。

三,STL的适配器

1.什么是适配器

  STL提供了三种适配器stack,queue和priority_queue。这些适配器是包装了序列式容器(vector,deque,list)中的一种。因此所谓的适配器就是序列式容器的包装器,注意:适配器没有提供迭代器。

2.stack(栈)

  栈可以使用序列式容器中的vector,deque,list中的任意一种作为其底层的数据结构。默认是使用deque来实现的stack。

3.queue(队列)

  队列可以使用deque和list中的任意一种作为其底层的数据结构。默认是使用deque来实现的queue。

4.priority_queue(优先队列)

  优先队列也是一种队列,不过在进入队列之后会对元素进行排序,可以使用vector和deque来实现其底层结构,默认是使用vector来实现priority_queue。

5.序列式容器和适配器比较


Vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。Vector的数据安排及操作方式与array非常相似,唯一的差别在于array是静态空间,一旦配置了就不能改变;vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。 vector不是一种数据类型,而只是一个类模版,可以用来定义多种数据类型。在定义了vector对象之后,vector类型的每一种都指定了其保存元素的类型。

vector的底层实现是数组,相比于数组,vector的优点是支持动态分配空间;缺点是如果在非尾部进行插入或者删除,效率比较低。

使用vector之前,必须包含相应的头文件和命名空间:
#include <vector>
using std::vector //也可直接使用using namespace std;

(1)vector常见操作:

v1.push_back()   //在数组的最后添加一个数据
v1.pop_back()    //去掉数组的最后一个数据 
v1.front()     //返回第一个元素(栈顶元素)
v1.begin()           //得到数组头的指针,用迭代器接受
v1.end()             //得到数组的最后一个单元+1的指针,用迭代器接受
v1.clear()        // 移除容器中所有数据
v1.empty()         //判断容器是否为空
v1.erase(pos)        //删除pos位置的数据
v1.erase(beg,end)// 删除[beg,end)区间的数据
v1.size()         //回容器中实际数据的个数
v1.insert(pos,data) //在pos处插入数据
v1.assign(beg,end)    //将[beg,end)一个左闭右开区间的数据赋值给c。
v1.assign (n,elem)    //将n个elem的拷贝赋值给c。
v1.at(int index)      //传回索引为index的数据,如果index越界,抛出out_of_range异常。
v1.capacity()         //返回容器中数据个数,翻倍增长。
v1.back()             //传回最后一个数据,不检查这个数据是否存在。
v1.resize(num)        //重新指定队列的长度。(往往用来增加vector的长度,小->大 ok 大->小 没用!)
vector<type>c;创建一个空的vector容器。

vector<type> c1(c2);复制一个vector。

vector<type> c(n);创建一个vector,含有n个数据,数据均以缺省构造产生,即全0;

vector<type> c(n,elem)创建一个vector,含有n个elem的拷贝数据。

vector<type> c(beg,end)创建一个以[beg,end)区间的vector。

~vector<type>()   销毁所有数据,施放内存。

(2)操作实例

#include <iostream>
#include <vector>
using namespace std;
//打印
void print(vector<int>v)
{
        vector<int>::iterator it;
        //使用迭代器遍历
        for(it = v.begin();it != v.end();it++)
        {
                cout<<*it<<" ";
        }
        cout<<endl;

}
int main()
{
        vector<int>v;
        vector<int>::iterator it;

        //1.添加元素
        for(int i = 0;i < 10;i++)
        {
                v.push_back(i);
        }

        //2.元素个数
        cout<<"when push,"<<"count="<<v.size()<<endl;

        //3.取第一个元素
        cout<<"取第一个元素:"<<v.front()<<endl;

        //4.使用迭代器打印
        print(v);

        //5.删除指定位置的元素
        it = v.end();
        it-=2;
        v.erase(it);
        print(v);

        //6.删除一定范围内的元素(begin,end)
        it-=3;
        v.erase(it,it+1);
        print(v);
        it = v.begin();

        //7.在指定位置插入元素
        v.insert(it,100);
        print(v);


        //8.依次删除所有元素
        for(int i = 0;i < v.size();i++)
        {
                v.pop_back();
        }
        cout<<"when pop,"<<"count="<<v.size()<<endl;

        //9.判断是否已经为空
        if(v.empty())
        {
                cout<<"此时数组为空!"<<endl;
        }
        else
        {

                cout<<"此时数组为不空!"<<endl;
        }
        return 0;
}

输出:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值