C++———STL容器个人理解(deque、set、map)

文章目录

  • deque
    • 声明
    • 函数
    • 代码实现🚀
  • set
    • 声明
    • 迭代器
    • size/empty/clear
    • begin/end
    • insert
    • find
    • lower_bound/upper_bound
    • erase
    • count
    • 代码实现🚀
  • map
    • 声明
    • 代码实现 🚀

deque

前一篇博客提到过,deque是双端队列,在队头和队尾进行插入删除都是O(1)的时间复杂度。但所有的操作平均下来的时间画的比vector多。

声明

#include<deque>
queue<int>a=({1,2,3,4});

函数

基本用法都一致,begin、end、front、back、push_back、push_front、pop_back、pop_front、clear

代码实现🚀

#include <iostream>
#include <deque>

using namespace std;

int main()
{
	deque<int>a;
	a.begin(), a.end(),a.front(), a.back();
	a.push_back(1);//在最后插入一个元素
	a.push_front(2);//在队头插入一个元素
	a[0];//随机访问一个数据元素
	a.pop_back();//弹出最后一个元素
	a.pop_front();//弹出第一个元素
	a.clear();
	system("pause");
	return 0;
}

set

头文件set包含set和multiset分别表示有序集合多重有序集合。也就是说在在set中不会有重复出现的元素,而multiset中允许有重复的元素。

声明

#include<set>
set<int>a;

迭代器

set和multiset的迭代器称为“双向访问迭代器”,不支持随机访问,仅支持带(*)解除引用,运算符号也仅只支持“++”和“- -”。

在访问迭代器时,若迭代器it++,指向下一个元素为这个集合从小到大排序的下一个元素。

set<int>a=({2,1,6,4});

size/empty/clear

与vector相似

begin/end

时间复杂度都为O(1),用法一致(左开右闭)。

insert

插入一个元素进入集合,时间复杂度为O(logn)。在set中如果已经集合中已有该元素,则不会插入,堆集合的状态也不会有影响。

a.insert(1);

find

该函数是用来查找一个元素,如果集合中存在该元素就返回指向该元素的迭代器,相反则返回a.end()。时间复杂度为O(logn)。

a.find(3);

lower_bound/upper_bound

时间复杂度为O(logn)。

lower_bound返回的是大于等于该元素最小的值。
upper_bound返回的是小与该元素最大的值。

a.lower_bound(2);
a.upper_bound(5);

erase

erase函数是用来删除指定元素的,需要被删除元素的迭代器或者就是该元素,如果在multiset中就是删除多个与指定元素相同的元素。时间复杂度为O(k+logn)。k为相同元素的个数。

a.erase(it);//it为指向x的迭代器
a.erase(x);//与上行代码作用一致

count

返回集合中该元素的个数,O(k+logn)

a.count(3);

代码实现🚀

#include <iostream>
#include <set>

using namespace std;

//底层实现为红黑树
int main()
{
	set<int> a({1,2,3,4});//元素不可以重复
	multiset<int> b;//元素可以重复

	set<int>::iterator it = b.begin();//迭代器
	++it, --it;
	it++, it++;
	a.end();//表示最后一个元素

	a.insert(5);//插入一个元素,时间复杂度为O(logn)
    a.find(2);   //查找一个元素,返回该元素下标。如果没找到该元素,就返回a.end()

	a.lower_bound(2);//找到大于等于2的最小元素的迭代器
	a.upper_bound(4);//找到小于4的最大元素的迭代器

	a.erase(it);//删除删除迭代器it所指向的元素,时间复杂度为O(logn)
	a.erase(2);//删除等于2的所有元素,时间复杂度为O(k+logn),k=2的个数

	a.count(2);//返回集合中等于2的元素个数,时间复杂度为O(k+logn),k=2的个数

	struct Rec     //自己定义一个set
	{
		int x, y;
		bool operator<(const Rec& t)const
		{
			return x < t.x;
		}
	};
	system("pause");
	return 0;
}

map

map容器是一个键值对key-value的映射。其中key要定义小于号运算符 。

声明

    #include<map>
    map<int><int> a;//存储的是一个有序数对

类型可以不一样

    map<string, int>a;
	a["op"] = 2;
	cout << a["op"] << endl;

find/insert/begin/end/clear均与set类似

代码实现 🚀

#include <iostream>
#include <map>
#include <vector>
using namespace std;

//底层实现为红黑树
int main()
{
	map<int,int> a;//存储的是一个二维数组,有序数对。
	a[1] = 2;
	a[100000000] = 3;
	cout << a[10000000] << endl;

	map<string, int>a;
	a["op"] = 2;
	cout << a["op"] << endl;

	map<string, vector<int>>a;
	a["op"] = vector<int>({1,2,3,4});
	cout << a["op"][2] << endl;
	system("pause");
	return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++ STL(Standard Template Library)是C++标准库中的一个重要组成部分,提供了一组数据结构和算法的模板类,可以大大简化C++程序的开发过程。STL包含了多个容器类,每个容器类都有其特定的特性和用途。 STL中的容器类主要分为序列容器和关联容器两大类。序列容器包括vector、list、deque和array,它们按照元素在容器中的位置进行存储和访问。关联容器包括set、multisetmap、multimap和unordered系列容器,它们按照键值进行存储和访问。 序列容器具有以下特性: 1. 动态大小:序列容器可以根据需要动态调整大小,可以在任意位置插入和删除元素。 2. 快速随机访问:序列容器中的元素可以通过索引快速访问,时间复杂度为O(1)。 3. 按顺序存储:序列容器中的元素按照插入的顺序存储,并保持元素的相对位置不变。 4. 支持迭代器:序列容器提供了迭代器,可以通过迭代器遍历容器中的元素。 关联容器具有以下特性: 1. 自动排序:关联容器中的元素按照键值自动排序,并且可以根据自定义的比较函数进行排序。 2. 快速查找:关联容器支持快速的查找操作,时间复杂度为O(log n)。 3. 不允许重复键值:setmap容器中的键值是唯一的,而multiset和multimap容器允许重复的键值。 4. 无序容器:unordered系列容器是C++11引入的,它们使用哈希函数来存储和访问元素,查找操作的平均时间复杂度为O(1)。 总而言之,C++ STL提供了丰富的容器类,每个容器类都有其独特的特性和适用场景,可以根据具体需求选择合适的容器来存储和操作数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++——STL容器](https://blog.csdn.net/JAN6055/article/details/122758690)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++的STL容器类详解](https://blog.csdn.net/Jinyizhi2233/article/details/131640448)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aitee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值