C++STL——序列容器(vector、deque、array、list、forward_list)

介绍

序列容器(Sequence Containers)也叫作顺序容器,序列容器各元素之间有顺序关系,每个元素都有固定位置,除非使用插入或删除操作改变这个元素的位置。

  • 特点
  1. 可以在容器一端添加、删除元素
  2. 序列容器有连续存储和链式存储两种存储方式
  3. 顺序都是由程序设计者决定的

vector

vector容器与动态数组相同,在插入或删除元素时能够自动调整自身大小,即vector容器能够自动处理存储数据所需的空间。

  • 特点
  1. 自身大小动态调整
  2. 插入元素时,插入位置之后的元素都要被顺序地向后移动
  3. 删除vector容器中的元素时,被删除元素后面的元素会顺序向前移动
  4. 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容器不支持插入、删除操作。

  • 特点
  1. 大小固定
  2. 不支持插入、删除元素
#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容器通过指针将前面的元素和后边的元素链接到一起。

  • 特点
  1. 不能通过[]、at方法来读取,只能通过迭代器读取
  2. 存储结构为双向链表
#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容器,该容器由单链表实现。

  • 特点
  1. 单链表结构,只能向后迭代
  2. 不支持insert()函数和erase()函数,但它提供了insert_after()函数和erase_after()函数用于插入和删除元素
  3. forward_list新增了两个函数before_begin()和cbefore_begin(),其中,before_begin()函数用于获取指向容器第一个元素之前位置的迭代器;cbefore_begin()用于获取指向容器第一个元素之前位置的const_iterator迭代器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值