容器的简单介绍

本文介绍了STL中的序列式容器,包括vector、list和deque的创建方式与使用方法。探讨了不同创建容器的方式,以及如何通过迭代器访问元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

容器是STL的基础,容器分2种:
序列式容器(sequential container)
关联式容器(associative container)
序列式容器会强调元素的次序,依次维护第一个元素、第二个元素……,直到最后一个元素,面向序列式容器的操作主要是迭代操作。
 
 
 
本节讨论序列式容器vector、list和deque的用法,以及序列式容器的共同操作。
使用序列式容器,须包含相关的头文件,vector、list及deque分别对应:
#include <vector>
#include <list>
#include <deque>
 
创建序列式容器的对象,大体有5种方式:
(1) 创建空的容器,此时容器中的元素个数为0。
vector<int> obV;
list<float> obL;
deque<double> obD;
 
(2)vector<double> obV(10); //vector型对产生特定大小的容器,此时容器中的元素被创建,编译器使用默认值为元素隐式初始化,像int、float和double等内建的数据类型会被初始化为0,对于类对象元素,将调用其无参构造函数(用户定义的或编译器缺省提供的)或每个参数都有默认值的构造函数。象obV中含10个double型元素, 初始化为0
list<int> obL(20); //list型对象obL中含20个int型元素, 初始化为0
deque<float> obD(30); //deque型对象obD中含30个float型元素, 初始化为0
 
(3)在(2)的基础上更进一步,创建特定大小的容器,并且为其中的每个元素指定初始值,此时在元素多少的参数后增加一个参数。
vector<int> obV(10,8); //10个int型元素, 每个都初始化为8
list<double> obL(20,3.1); //20个double型元素, 每个都初始化为3.1
deque<string> obD(30,"Hello"); //30个string型元素, 每个都初始化为"Hello"
 
(4)根据已有同类型的容器创建新容器,并将其中的元素完全复制过来,设obV1、obL1和obD1都是现成的容器,里面存储的数据均为int型,则可用下述命令创建新容器
vector<int> obV2(obV1); //或vector<int> obV2=obV1;
list<int> obL2(obL1); //或list<int> obL2=obL1;
deque<int> obD2(obD1); //或deque<int> obD2=obD1;
 
(5)通过一对迭代器(可暂时理解为指针),以使编译器决定元素的个数和初值,这对迭代器用以标识一组元素区间。
int sz[5]={11,2,3,4,45};
vector<int> obV(sz, sz+5);
list<int> obL(sz, sz+5);
deque<int> obD(sz, sz+5);
vector和deque类的容器创建后就可以通过容器名[下标]或容器名.at(序号)的形式对元素进行随机访问(这是因为这2种类模板对下标运算符[]进行了重载);也支持迭代器访问。
但list类的容器不支持下标运算符[],无法使用[]对元素进行随机访问。但支持双向迭代器访问,如:
list<int>::iterator iter = obL.begin();
 
动手敲一敲的示例代码:
#include <iostream>
#include<vector>
#include<list>
#include<deque>
using namespace std;

int main() {
	// Create an empty vector
	vector<int> test1;
	cout << "test1的元素个数为:" << test1.size() << endl;

	//Create deque

	double sz[5] = { 1,2,3,4,5 };
	deque<double> test2(sz, sz + 5);
	for (int i = 0; i < test2.size(); i++) {
		cout << test2[i] << " ";
	}
	cout << endl;
	deque<double>::iterator id = test2.end();
	while (id != test2.begin()) {
		id--;//注意的是id指向的是最后一个元素的下一个迭代器
		cout << (*id) << " ";
	}
	cout << endl;
	//Create List
	list<float> test3(3, 5); //list不支持下标访问
	list<float>::iterator it = test3.begin();
	while (it != test3.end()) {
		(*it) += 2;
		cout << (*it) << " ";
		it++;
	}
	cout << endl;

	//再创建一个List容器,使其内容与test3内容进行交换
	list<float> test4(4, 9);
	test3.swap(test4);
	for (it = test3.begin(); it != test3.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;

	system("pause");
	return 0;
}

发现了一些写得比我更好的博客,我就不献丑了,下面式传送门:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值