介绍
序列容器(Sequence Containers)也叫作顺序容器,序列容器各元素之间有顺序关系,每个元素都有固定位置,除非使用插入或删除操作改变这个元素的位置。
- 特点
- 可以在容器一端添加、删除元素
- 序列容器有连续存储和链式存储两种存储方式
- 顺序都是由程序设计者决定的
vector
vector容器与动态数组相同,在插入或删除元素时能够自动调整自身大小,即vector容器能够自动处理存储数据所需的空间。
- 特点
- 自身大小动态调整
- 插入元素时,插入位置之后的元素都要被顺序地向后移动
- 删除vector容器中的元素时,被删除元素后面的元素会顺序向前移动
- vector对象在定义后所有元素都会被初始化,基本数据类型默认值为0
vector容器提供了迭代器,通过迭代器可以访问、修改容器中的元素。vector容器提供了iterator、const_iterator、reverse_iterator和const_reverse_iterator四种迭代器。
迭代器 | 说明 |
---|---|
iterator | 正向遍历容器元素 |
reverse_iterator | 反向遍历容器元素 |
const_iterator | 正向遍历容器元素,但通过const_iterator只能访问容器元素,不能修改元素的值。 |
const_reverse_iterator | 反向遍历容器元素,但通过const_reverse_iterator只能访问容器元素,不能修改元素的值。 |
vector<类型>::迭代器 自定义名字
迭代器可以执行++、–、与整数相加减等算术运算,以达到遍历容器元素的目的。
迭代器遍历容器到达尾部时,指向最后一个元素的后面,而不是指向最后一个元素,即使用end()函数、rend()函数、cend()函数和crend()函数获取的迭代器,指向最后一个元素后面的位置,而不是指向最后一个元素。
#include <iostream>
#include <vector>
using namespace std;
int main() {
//构造vector
vector<int> a(10); //指定容器大小为10,初始值默认为0
vector<int> b(10, 8);//指定容器大小为10,初始值为8
vector<int> c{ 1,2,3,4,5,6 }; //列表初始化
vector<int> d;//初始化状态为空
//赋值函数
//d.assign(10, 1);//10个1给d
//d.assign(b.begin(), b.end());
vector<int> e(c);
cout << "e的容量:" << e.capacity() << ",e的实际大小:" << e.size() << endl;
cout << "第三个元素是:" << e.at(2) << ",第三个元素是:"<<e[1]<< endl;
cout << "第一个元素是:" << e.front()<< ",最后一个元素是:"<<e.back()<< endl;
//尾部插入删除
for (int i = 0; i <= 5; i++) {
d.push_back(i+1);
}
d.pop_back();//删除尾部元素
vector<int>::iterator pos;
for (pos = d.begin(); pos != d.end(); pos++) {
cout << *pos<< " ";
}
return 1;
}
插入删除使用insert()、erase()。
insert(pos,elem);
insert(pos,n,elem);
insert(pos,begin,end);
earse(pos);
earse(begin,end); //除区间元素时,区间是左闭右开
deque
deque容器与vector容器非常相似,采用动态内存管理的方式存储元素。与vector不同的是,deque是两端开口的,支持从两端插入、删除数据。
deque的操作方法和vector容器几乎相同。最大的区别是deque容器不支持vector容器中的reserve()函数、capacity()函数和data()函数,并且新增了pop_front()、push_front()函数,用于从队首弹出、插入元素。
array
array是C++11标准新增加的容器,它也是一个序列容器,只是array的大小是固定的,一旦分配了array容器,其大小就不能再改变,不允许向array容器插入元素或从array容器中删除元素,即array容器不支持插入、删除操作。
- 特点
- 大小固定
- 不支持插入、删除元素
#include <iostream>
#include <array>
using namespace std;
int main() {
//构造array
array<int,3> a1;
array<int, 3> a2{ 1,2,3 };
a1.fill(2);
a1.swap(a2);
array<int, 3>::iterator pos;
cout << "a1:";
for (pos = a1.begin(); pos != a1.end(); pos++) {
cout << *pos << " ";
}
array<int, 3>::iterator pos1;
cout <<endl<< "a2:";
for (pos1 = a2.begin(); pos1 != a2.end(); pos1++) {
cout << *pos1 << " ";
}
return 1;
}
list
list容器以双向链表形式实现,list容器通过指针将前面的元素和后边的元素链接到一起。
- 特点
- 不能通过[]、at方法来读取,只能通过迭代器读取
- 存储结构为双向链表
#include <iostream>
#include <list>
using namespace std;
template<typename T>
void print(list<T> a) {
typename list<T>::iterator pos; //typename目的在于向编译器说明template内的某个标识符T是类型
for (pos = a.begin(); pos != a.end(); pos++) {
cout << *pos << " ";
}
}
int main() {
//构造list
list<int> l1; //空
list<int> l2(5);//指定大小
list<int> l3(5, 8);//指定5个8
list<int> l4(l2.begin(), l2.end());
list<int> l5(l4);
//赋值
//l1.assign(l2.begin(), l2.end());
//插入删除元素
l1.push_back(2); //后面插入元素
l1.push_back(1);
l1.insert(l1.begin(), 66);
l1.push_front(1);
//l1.earse(pos);
//l1.pop_back();
//l1.pop_front();
l1.remove(1); //删除所有值为1 的数据
print<int>(l1); // 66 2
return 1;
}
forward_list
C++11标准新增了forward_list容器,该容器由单链表实现。
- 特点
- 单链表结构,只能向后迭代
- 不支持insert()函数和erase()函数,但它提供了insert_after()函数和erase_after()函数用于插入和删除元素
- forward_list新增了两个函数before_begin()和cbefore_begin(),其中,before_begin()函数用于获取指向容器第一个元素之前位置的迭代器;cbefore_begin()用于获取指向容器第一个元素之前位置的const_iterator迭代器。