2020-02-25 C++提高编程05-基本框架

关键字: vector容器  deque容器

3.2 vector容器

3.2.1基本概念

功能:vector数据结构和数组非常相似,也称为单端数组,在尾端可以进行插入删除操作;

vector与普通数组区别:数组为静态空间,vector可以动态扩展

注:vector容器的迭代器是支持随机访问的迭代器

动态扩展

并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间;

vector容器的迭代器是支持随机访问的迭代器

3.2.2 vector构造函数

函数原型:

1 vector<T> v;//采用模板实现类实现,默认构造函数

2 vector(v.begin(),v.end());//将v[begin(),end())区间中的元素拷贝给本身

3 vector(n,elem);//构造函数将n个elem拷贝给本身

4 vector(const vector &vec);//拷贝构造函数

示例:

void test01()

{

vector<int> v1;

vector<int> v2(v1.begin(), v1.end());

vector<int> v3(10, 100);

vector<int> v4(v3);

}

3.2.3 vector赋值操作

函数原型:

1 vector &operator=(const vector &vec);

2 assign(beg,end);//左开右闭

3 assign(n,elem);

示例:

void test01()

{

vector<int> v1;

for (int i = 0; i < 10; ++i)

{

v1.push_back(i);

}

vector<int> v2 = v1;

vector<int> v3;

v3.assign(v1.begin(), v1.end());

vector<int> v4;

v4.assign(10, 100);

}

3.2.4 vector容量和大小

函数原型:

1 empty();//判空

2 capacity();//容量

3 size();//返回容器中元素个数

4 resize(int num);//重新指定容器长度,若容器变长,以默认值填充;若变短,则末尾元素被删除;

5 resize(int num, elem);//重新指定容器长度,若容器变长,以elem值填充;

3.2.5 vector插入和删除

函数原型:

1 push_back(ele);//尾插

2 pop_back();//删除最后一个元素

3 insert(const_iterator pos, ele);//迭代器指向位置pos插入元素ele)

4 insert(const_iterator pos, int count, ele);//迭代器指向位置pos插入count个元素ele)

5 erase(const_iterator pos);//删除迭代器指向元素

6 erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素

7 clear();//删除容器中所有元素

3.2.6 vector数据存取

函数原型:

1 at(int idx);//返回索引idx所指的数据

2 operator[];//返回索引idx所指的数据

3 front();//返回容器中第一个数据元素

4 back();//返回容器中最后一个数据元素

3.2.7 vector互换容器

功能:实现两个容器内元素进行互换

函数原型:swap(vec);

用途:收缩内存

示例:

void test02()

{

vector<int> v;

for (int i = 0; i < 1000; ++i)

{

v.push_back(i);

}

cout << "capacity: " << v.capacity()<< endl;

cout << "size: " << v.size() << endl;

v.resize(3);//重新指定大小 容量不变

cout << "capacity: " << v.capacity() << endl;

cout << "size: " << v.size() << endl;

//巧用swap收缩内存

vector<int>(v).swap(v);

//vector<int>(v)//匿名对象 调用拷贝构造函数

//按照v目前所用元素个数初始化该匿名对象

//匿名对象当前行结束系统自动回收

cout << "capacity: " << v.capacity() << endl;

cout << "size: " << v.size() << endl;

}

3.2.8 vector预留空间

功能:减少vector动态扩展容量时的扩展次数

函数原型:reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问

示例:

void test01()

{

//统计扩展(开辟空间)次数

int num = 0;

int *p = NULL;

vector<int> v1;

//利用reserve预留空间

v1.reserve(100000);

for (int i = 0; i < 100000; ++i)

{

v1.push_back(i);

if (p != &v1[0])

{

p = &v1[0];

++num;

}

}

cout << "num = " << num << endl;

}

3.3 deque容器

3.3.1 deque容器基本概念

功能:双端数组,可以对头端进行插入删除操作

deque和vector区别:

1 vector对于头部的插入删除效率低,数据量越大,效率越低

2 deque相对而言,对头部的插入删除速度比vector快

3 vector访问元素的速度会比deque快,这和两者内部实现有关

deque内部工作原理:

deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据

中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间

注:deque容器迭代器也是支持随机访问的

3.3.2 deque构造函数

函数原型:

1 deque<T> deqT;//默认构造

2 deque(beg,end);//构造函数将[begin,end)区间中的元素拷贝给本身

3 deque(n,elem);//构造函数将n个elem拷贝给本身

4 deque(const deque &deq);//拷贝构造函数

3.3.3 deque赋值操作

函数原型

1 deque &operator=(const deque &deq);

2 assign(beg,end);

3 assign(n,ele);

3.3.4 deque大小操作

函数原型

1 deque.empty();

2 deque.size();

3 deque.resize(num);//以默认值0填充

4 deque.resize(num,elem);//以elem填充

注:deque容器不存在容量的概念,因为容量不受限制,

可以无限开辟新空间,中控器只需增加地址;

3.3.5 deque插入和删除

函数原型:

两端操作:

1 push_back(elem);

2 push_front(elem);

3 pop_back();

4 pop_front();

指定位置操作:

1 insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据位置

2 insert(pos,n,elem);//在pos位置插入n个elem,无返回值

3 insert(pos,beg,end);//插入一个区间数据。无返回值

4 clear();

5 erase(beg,end);//删除区间数据,返回下一个数据位置

6 erase(pos);//删除pos位置数据,返回下一数据的位置

3.3.6 deque数据存取

函数原型

1 at(int idx);

2 operator[];

3 front();

4 back();

3.3.7 deque排序

函数原型

sort(iterator beg,iterator end);//对区间内的元素进行排序

注:头文件 <algorithm>

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容