C++标准模板库学习笔记之序列容器(vector、array)

序列容器以线性序列的方式存储元素。五种标准的序列容器:array<T,N>,vector<T>,deque<T>,list<T>,forward_list<T>。

Array

array<T, N>是一个有N个T类元素的序列,类似于数组。既然是数组,那么它没法增加和删除元素,在定义的时候就指定了类型和大小。

初始化:  

例子:array<int, 100> data;    //此处没有进行初始化,得到的是不确定的值。

array<int, 100> data{};    //此处进行了初始化,得到了100个0。

调用成员函数fill可以将数组的元素都置为同一个值。

例如:data.fill(10)。//将data的元素都置为10.

访问元素:[]、at()

区别是at()做越界检查。在明确知道不会越界的时候用[]效率更高。

size()方法可以知道数组的大小。empty()方法可以知道数组是否为空。

front()方法和back()方法分别返回数组首元素和尾元素的引用。

数组迭代器:begin和end方法可以返回指向数组首元素和末尾元素后一个位置的迭代器。

使用方法:begin(data)、end(data)

注意,迭代器并没有保留容器的任何信息,即我们不知道这个迭代器指向的是一个array容器还是vector容器。

这里的设计思想很重要:算法是独立于容器类型的

cbegin方法和cend方法:返回const迭代器。

rbegin方法和rend方法:得到指向最后一个元素的迭代器和第一个位置的前一个位置的迭代器。

array容器的比较:比较的前提:类型相同,容量相同。

array容器的赋值,可以将一个array容器的值赋给另一个,必须保证大小相同,类型相同。

Vector

vector容器是平时用的最多的,但是还是需要深入学习。vector容器是个动态数组。

初始化

vector<T> vec;//此时vector容器中没有元素,不会分配空间。添加第一个数据项以后才会分配空间

reverse()方法,用于设定vector容器的容量,vec.reverse(10)设定容器容量为10,如果容器原来的容量大于10,该语句不起作用。注意,容量和长度的差异,长度是现有数据的个数,而容量是最多能放多少个数据。同时还需要注意的是,reverse方法会重新分配内存,此时的内存地址可能会发生改变,迭代器操作的时候要特别注意。

vector<int> vec{1,2,3};    //初始化容器为1,2,3,此时size()为3,capacity也为3

vector<int> vec(20);    //初始化容器为20个0,此时size()为20,capacity也为20

vector<int> vec(10, 3);    //初始化容器为10个3,此时size()为10,capacity也为10

vector容器考虑到了内存分配的开销问题,即在必要时分配。

size()查看容器中现有的元素个数,capicity()查看容器的容量。

当对容器进行push_back/insert/emplace_back/emplace时,vector容器的容量发生变化,在64位操作系统下VS2015环境下测得容器的容量会变为原来的1.5倍。

同样是容器,对string容器进行这种操作时,发现其size和capacity是一样的,即不会申请更大的空间,会不会是string对象的开销比较大,超过了申请额外空间的开销?

使用resize函数可以改变容器的大小,但同时会改变容器的值。减小容器的时候会去除超过resize大小的元素。

pop_back()方法:删除容器末尾的元素。调用一次就使size减1,capacity不受影响。

访问元素同Array:[]、at()。

vector容器的迭代器:

使用copy算法添加元素:copy(),三个参数:迭代器start,迭代器end,元素存放的位置(输出迭代器)

copy(begin(vec), end(vec), ostream_iterator<int>(cout, " "));    //将指向vec容器的迭代器输出到标准输出流中。

如果插入的是对象,emplace_back插入比push_back更高效。例子:

vector<string> v1;

v1.push_back("123");//此时会生成一个临时对象,然后再将这个临时对象挪到vector中。

v1.emplace_back("123");//而emplace_back方法则直接在容器中生成了字符串对象。

emplace方法与insert方法:

前者比后者高效:对于对象类型,insert会生成临时对象。

find方法:找寻指定的迭代器区间的第一个指定元素:

auto iter = find(begin(vec), end(vec), 1);    //从前往后找第一个1出现的地方,并返回。

删除元素:

clear()方法可以移除所有元素。移除以后,容器size为0,capacity跟移除以前相同。

erase()方法:删除容器中的元素。vec.erase(begin(vec))//删除首元素

vec.erase(begin(vec), begin(vec)+3)//删除前三个元素,返回一个迭代器

erase改变size,不会改变容器的capacity。

remove()方法删除匹配到的元素:vec.remove(begin(vec), end(vec), 5);//删除容器中值为5的元素,返回一个迭代器

remove以后不会减小size,它会将删除的元素赋空。

今天就这么多了。


猜你喜欢

转载自blog.csdn.net/u012260341/article/details/79789297