c++STL常见容器的使用

泛型编程

c++的STL库体现了泛型编程的思想,面向对象编程关注的是编程的数据方面,而泛型编程关注的是算法。泛型编程旨在编写独立于数据类型的代码。

vector容器(数组)

重载了"[]"运算符,可对其中的元素随机访问。示例代码:

#include <vector>
#include <iostream>
using namespace std;
int main()
{
//可像使用数组一样
    vector<int>b(3);//创建一个含有三个元素的vector容器
	cout << b[0] << b[1]<<b.size();//s输出结果为003
	//注意,若这样定义则为定义含三个vector<int>类型的数组
	vector<int>c[3];//c[0],c[1],c[2]均为一个vector容器
//添加删除元素
	vector<int> a{1,3,7,2,9,6,1};
	
	a.push_back(7);//在末尾添加元素(常用)

	a.pop_back();//移除最后一个元素(非访问)
//容量判断
	a.empty();//判空
	a.size();//返回元素数
//元素的访问
	//可直接当数组使用(常用)
	a[1];//3
	a[2];//7
	
	cout<<a.at(4);//访问指定的元素('4'为元素下标值),并进行越界检查
	a.front();//访问第一个元素
	a.back();//访问最后一个元素
//元素的遍历
	//遍历方法1
	for (auto x : a)
	{
		cout << x<<'\t';//打印所有元素值
	}

	//遍历方法2
	for (int i = 0; i < a.size(); i++)
	{

		cout << a[i] << '\t';
		//或者:
		cout << a.at(i);

	}
	//遍历方法3
	for (vector<int>::iterator i = a.begin(); i != a.end(); i++)
	{
		cout << *i<<'\t';
	}
//若觉得麻烦vector<int>::iterator可用auto替换


	return 0;
}

deque容器(双端队列)

重载了"[]"运算符,可对其中的元素随机访问。

#include <deque>
#include <iostream>
using namespace std;

int main()
{

	deque<int> a{1,23,2,3,1};
//添加删除元素
	a.push_front(2);//队首添加元素
	a.emplace_front(3);

	a.push_back(1);//队尾添加元素
	a.emplace_back(1);

	a.pop_back();//删除队尾元素(非访问元素)
	a.pop_front();//删除队首元素

//容器的判空
	a.empty();
	a.size();

//元素的访问
	a.at(1);//下标为1的元素
	a[1];//下标为1的元素
	a.front();//访问第一个元素
	a.back();//访问最后一个元素

//元素的遍历
	//遍历方法1
	for (auto x : a)
	{
		cout << x << '\t';//打印所有元素值
	}

	//遍历方法2
	for (int i = 0; i < a.size(); i++)
	{

		cout << a[i] << '\t';
		//或者:
		cout << a.at(i);

	}
	//遍历方法3
	for (deque<int>::iterator i = a.begin(); i != a.end(); i++)
	{
		cout << *i<<'\t';
	}

	return 0;
}

list容器(双向链表)

未重载"[]"运算符,不可对其中的元素随机访问。

#include <list>
#include <iostream>
using namespace std;
int main()
{

	list<int>a{ 22,2234,44 };
//添加删除元素
	a.push_front(3);//队首添加元素
	a.emplace_front(5);

	a.push_back(12);//队尾添加元素
	a.emplace_back(56);

	a.pop_back();//删除队尾元素(非访问元素)
	a.pop_front();//删除队首元素
//容器的判空
	a.empty();
	a.size();
//容器的操作
	a.sort();//排序

	list<int>b{ 9,9,2,1,2,3 };
	b.sort();
	a.merge(b);//对两个有序链表进行合并

//元素的访问
	a.front();//访问第一个元素
	a.back();//访问最后一个元素
//元素的遍历
	//遍历方法1
	for (auto x : a)
	{
		cout << x << '\t';//打印所有元素值
	}

	//遍历方法2
	for (list<int>::iterator i = a.begin(); i != a.end(); i++)
	{
		cout << *i << '\t';
	}

	return 0;
}

queue适配器(双端队列)

未重载"[]"运算符,不可对其中的元素随机访问*不可对其中的元素随机访问,API文档中说道:“std::queue 类是容器适配器,它给予程序员队列的功能——尤其是 FIFO (先进先出)数据结构。”,
即把它当做真正的队列使用。

#include <queue>//队列
#include <iostream>
using namespace std;
int main()
{
	//queue<int>a{ 9,9 };不允许这样初始化
	queue<int> a;
//添加删除元素
	a.push(2);
	a.emplace(7);//入队
	
	a.pop();//出队(返回值无)
//访问元素
	a.front();//访问队首元素
	a.back();//访问最后一个元素

//适配器判空
	a.size();
	a.empty();
//此容器不可遍历
	
	return 0;
}

stack适配器(栈)

未重载"[]"运算符,不可对其中的元素随机访问*不可对其中的元素随机访问,API文档中写道:“std::stack 类是容器适配器,它给予程序员栈的功能——特别是 FILO (先进后出)数据结构。”,
即把它当做真正的栈使用。

#include<stack>
#include <iostream>
using namespace std;
int main()
{
	//stack<int>a{ 1 };//不允许这样初始化
	stack<int>a;
//添加删除元素
	a.emplace(2);
	a.push(2);//入栈

	a.pop();//出栈(返回值无)
//元素的访问
	a.top();//取栈顶元素

//适配器判空
	a.size();
	a.empty();

//无遍历操作

	return 0;
}

set关联容器(红黑树)

相当于一个集合,可查找一个数是否在这个集合中,该容器中的元素的键和键值为同一个,自动排序,不允许相同元素。

#include<set>
#include <iostream>
using namespace std;
int main()
{
	set<int>a{ 1,2,3,4,6,4 };
	
//添加删除元素
	a.emplace();//添加元素
//无元素的访问
//查找(非常好用)
	a.count(2);//返回匹配特定键的元素数量
	a.find(2);//查找键为2的元素,若找到则返回2的迭代器。若找不到,则返回end()迭代器。
	//a.contains(2);//与find()相似,不过返回值为true或false,c++20可用
	a.lower_bound(2);//返回指向首个不小于给定键的元素的迭代器
	a.upper_bound(2);//返回指向首个不大于给定键的元素的迭代器
//容量
	a.size();
	a.empty();


	return 0;
}

map关联容器(红黑树)

重载了“[]”运算符,相当于一个集合,可查找一个数是否在这个集合中,每一个键对应一个键值,自动排序,不允许相同元素。注意第一个值为键,第二个位键值。

#include <map>
#include <iostream>
using namespace std;
int main()
{
	map<int,int>a{ pair<int,int>(1,2),pair<int,int>(6,7)};
	a[1] = 3;//相当于a.emplace(1,3);
	//map作为关联式容器,每一个元素都含有键和相对应的键值,两者相关联
//插入删除元素
	a.emplace(1, 1);
	//a.insert();//需要用到迭代器
	a.insert_or_assign(3, 4);
	a.try_emplace(3, 5);//若键不存在则原位插入,若键存在则不做任何事

//元素访问
	a.at(1);//查找键为1的元素,找到则返回键1对应的键值,否则返回空
	a[1];//1为键,a[1]表示1对应的键值

//查找(非常好用)(注意,查找的都是查键)
	a.count(2);//返回匹配特定键的元素数量
	a.find(2);//查找键为2的元素,若找到则返回2的迭代器。若找不到,则返回end()迭代器。
	//a.contains(2);//与find()相似,不过返回值为true或false,c++20可用
	a.lower_bound(2);//返回指向首个不小于给定键的元素的迭代器
	a.upper_bound(2);//返回指向首个不大于给定键的元素的迭代器

//容量
	a.size();
	a.empty();

	return 0;
}

详细信息可访问c++STL滴API文档:C++API文档,里面有很详细的STL库中模板类的成员函数和模板类,我在这里仅给出了自己觉得方便的成员函数和类。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值