当前位置: 代码迷 >> 综合 >> Primer C++ 学习笔记:顺序容器vector
  详细解决方案

Primer C++ 学习笔记:顺序容器vector

热度:91   发布时间:2024-02-05 00:57:31.0

顺序容器类型:

容器均定义为模板类,顺序容器几乎可以保存任意类型的元素,我们可以定义一个容器,其元素的类型是另一个容器

  1. vector:可变大小数组。支持快速随机访问。在尾部之外的位置插入成删除元素可能很慢
  2. deque:双端队列。支持快速随机访问。在头尾位置插入/删除速度很快
  3. list:双向链表。只支持双向顺序访问。在list中任何位置进行插入/删除操作速度都很快
  4. forward_list:单向链表。只支持单向顺序访问。在链表任何位置进行插入/删除操作速度都很快
  5. array:固定大小数组。支持快速随机访问。不能添加或删除元素
  6. string:与vector相似的容器,但专门用于保存字符。随机访问快。在尾部插入/删除速度快 

 除了固定大小的array外,其他容器都提供高效、灵活的内存管理,下面以vector为例介绍一下相关的用法,有写成员函数可能并不通用,例如forward_list就没有size操作,这里就不一一点出来了。

定义和初始化:

vector<int> a 默认构造函数
vector<int> a(b) a初始化为b的拷贝
vector<int> a=b
vector<int> a={1,2,3,4,..} a初始化为初始化列表中元素的拷贝
vector<int> a{1,2,3,4,..}
vector<int>a(b,c) a初始化为迭代器b和c指定范围中的元素的拷贝
vector<int>a(n) a包含n个元素,这些元素进行了值初始化
vector<int>a(n,t) a包含n个初始化为值t的元素

 

赋值:

a=b 将a中的元素替换为b中元素的拷贝
a={1,2,3,...} 将a中元素替换为初始化列表中元素的拷贝
swap(a,b) 交换a和b中的元素,swap通常比从b向a拷贝元素快得多
a.swap(b)
a.assign(b,d)

将a中的元素替换为迭代器b和d所表示的范围中的元素。

迭代器b和d不能指向a中的元素

a.assign({1,2,...}) 将a中的元素替换为初始化列表中的元素
a.assign(n,t) 将a中的元素替换为n个值为t的元素

添加元素:

a.push_back(t)

在a的尾部创建一个值为t或由args创建的元素

返回void

a.emplace_back(args)
a.push_front(t)

在a的头部创建一个值为t或由args创建的元素

返回void

a.emplace_front(args)
a.insert(p,t) 在迭代器p指向的元素之前创建一个值为t或由args创建的元素。返回指向新添加的元素的迭代器
a.emplace(p,args)
a.insert(p,n,t) 在迭代器p指向的元素之前插入n个值为t的元素。返回指向新添加的第一个元素的迭代器,若n为0,则返回p
a,insert(p,b,e) 将迭代器b和e指定的范围内的元素插入到迭代器p指向的元素之前。b和e不能指向a中的元素。返回指向新添加的第一个元素的迭代器。若范围为空,则返回p
c,insert(p,{1,2,3,...}) 将元素值列表插入到迭代器p指向的元素之前。返回指向新添加的第一个元素的迭代器。若列表为空,则返回p

使用emplace_front,emplace,emplace_back时,将参数(args)传递给元素类型的构造函数。如下面代码:

class Book
{int a;int b;int c;book(int x,int y,int z):a(x),b(y),z(c){}
};vector<Book> book;
book.emplace_back(1,2,3);

访问元素:

a.back() 返回a中尾元素的引用
a.front() 返回a中首元素的引用
a[n]

返回a中下标为n的元素的引用,n是一个无符号整数

若n>=a.size(),则函数行为未定义

a.at(n)

返回a中下标为n的元素的引用。如果下标越界,则抛出一个out_of_range异常

 删除元素:

 

a.pop_back() 删除a中尾元素
a.pop_front() 删除a中首元素
a.erase(p) 删除迭代器p所指定的元素,返回一个执行被删除元素之后元素的迭代器,若p指向尾元素,则返回尾后迭代器。若p是尾后迭代器,则函数行为未定义
a.erase(b,e) 删除迭代器b和e所指定范围内的元素。返回一个指向最后一个被删除元素之后的元素的迭代器,若e本身就是尾后迭代器,则也返回尾后迭代器
a.clear() 删除a中所有的元素

操作容器空间:

a.resize(n) 调整a的大小为n个元素,若n<a.size(),则多出的元素被丢掉。若需要添加新元素,则对新元素进行值初始化
a.resize(n,t) 调整a的大小为n个元素,若需要添加新元素,则对新元素初始化为t
a.reserve(n) 分配至少能容纳n个元素的内存空间
a.capacity() 不重新分配内存空间的话,a最大可以保存多少元素
a.shrink_to_fit() 将capacity()减少为于size()相同大小