STL各个容器的使用以及常用的查找

关于vector容器的使用我写在了https://blog.csdn.net/qq_42002426/article/details/108169478
所有容器都有size() empty()方法
在这里插入图片描述

1.deque 双端数组,操作特点:在两端插入和删除效率都比较好,在指定位置插入,也会引起数据元素的移动。
支持随机访问
deque分段连续的内存空间

deque的几种构造方法

//构造
void test01() {
	deque<int>d;
	deque<int>d1(10, 5);
	deque<int>d2(d1.begin(), d1.end());
	deque<int>d3(d2);
	for (deque<int>::iterator d = d3.begin(); d != d3.end(); d++) {
		cout << *d << endl;
	}
}

deque的大小操作

//大小操作
void test02() {
	deque<int>d1;
	deque<int>d2;
	deque<int>d3;
	d1.assign(10, 5);//10ge 5
	d2.assign(d1.begin(), d1.end());//迭代器区间赋值
	d3 = d2;//等号赋值

	d1.swap(d2);//交换两个空间的元素
	//size empty resize 同理vector
}

插入和删除

void test03() {
	deque<int> d;
	d.push_back(100);
	d.push_front(200);
	d.push_front(300);
	d.push_back(400);
	//输出顺序应该是300 200 100 400
	//pop_front和pop_back同理相当于是删除操作
	d.clear();//清楚全部元素。。~~一袋米要扛几楼~~ 
}

2. stack容器 规则:先进后出
不能遍历 不提供迭代器 也不支持随机访问
while(!stack.empty()){
cout<< stack.top() <<endl;
stack.pop();
}

//栈是不能遍历的,只能从栈顶进行操作,不提供迭代器

void test01() {
	stack<int>s1;
	stack<int>s2(s1);

	s1.push(10);
	s1.push(20);
	s1.push(30);
	
	s1.pop();
	s1.top();//返回栈顶元素

	s1.size();//返回堆栈大小
}

3.queue队列 规则:先进先出
不能遍历 不提供迭代器 也不支持随机访问
while(!queue.empty()){
cout<< queue.fonr() <<endl;
queue.pop();
}
队列很像是排队,先排队的人先完事,后排队的后完事

//队列:在一端插入再在一端删除,先进先出
//不能遍历想输出元素的话用while(q.size()>0)cout<<q.front()<<endl;q.pop();
void test01() {
	queue<int>q;
	queue<int>q1(q);

	q.push(10);
	q.push(20);
	q.push(30);
	//输出顺序 10 20 30
	q.pop();
	q.back();//返回队尾
	q.front();//返回队受

	queue<int>q3;
	q3 = q;

	q.size();
	q.empty();
}

4.list 容器 非常常用 STL中双向链表
在任何位置插入和删除效率都比较好,因为插入和删除对于数组来说,不用移动元素
不支持随机访问,因为是非连续的内存空间,所以说为了保存结点和结点之间的前驱后继关系
需要额外的空间开销

自己提供了sort排序的方法,因为算法提供的sort是要支持随机访问的
有查找功能find(),要清楚查找基础数据类型,查找对象(提供回调)

构造及输出链表中的元素

//链表最后都指向为空
void test01() {
	list<int> l1;
	list<int> l2(l1.begin(), l1.end());
	list<int> l3(10, 1);//10个1
	list<int> l4(l3);
	l4 = l3;

	for (list<int>::iterator it = l3.begin(); it != l3.end(); it++) {
		cout << (*it) << endl;
	}
}

插入和删除 链表的删除不同于其他容器有一个remove(num)函数可移除与num想匹配的元素

void test02() {
	list<int> mylist;
	list<int> l(2, 100);
	mylist.push_back(100);
	mylist.push_front(200);
	
	mylist.insert(mylist.end(), 400);//在某个位置插入
	mylist.insert(mylist.begin(), 300);

	mylist.insert(mylist.begin(), 3, 500);//在某个位置插入3个500
	mylist.insert(mylist.begin(), l.begin(), l.end());//在某个位置插入区间内的数据

	mylist.remove(100);//删除容器内所有与100匹配的元素  erase(pos)删除pos位置的元素
}

赋值操作

//赋值操作
void test03() {
	list<int>myl;
	list<int>my2;
	myl.assign(10, 9);//10个9
	myl.swap(my2);//交换了
}

排序与翻转

//排序 翻转
void test04() {
	list<int>l;
	for (int i = 0; i < 10; i++) {
		l.push_back(i);
	}
	l.reverse();//数据反转
	l.sort();//这个是list里的排序函数默认从小到大,而不是平时用的那个算法
}

对组 pair 将两个值合并成一个值
pair<类型,类型>pair1;
make_pair(具体类型,具体类型);

pair<T1, T2> p1;           //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。
pair<T1, T2> p1(v1, v2);   //创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,second成员初始化为v2。
make_pair(v1, v2);         // 以v1和v2的值创建一个新的pair对象,其元素类型分别是v1和v2的类型。
p1 < p2;                   // 两个pair对象间的小于运算,其定义遵循字典次序:如 p1.first < p2.first 或者 !(p2.first < p1.first) && (p1.second < p2.second) 则返回true。
p1 == p2;                 // 如果两个对象的first和second依次相等,则这两个对象相等;该运算使用元素的==操作符。
p1.first;                  // 返回对象p1中名为first的公有数据成员
p1.second;                 // 返回对象p1中名为second的公有数据成员

5 set是STL中一种标准关联容器。它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内 存移动和拷贝,所以效率比较高。由于他是基于红黑树实现的,所以它天生自带排序功能
插入删除及交换操作 (set中的元素是不会重复的!)

//仿函数
class mycompare {
public:
	 bool operator()(int v1,int v2){
		 return v1 > v2;
	 }
};
void test01() {
	set<int,mycompare>s1;//加了仿函数就是从大到小了
	s1.insert(1);
	s1.insert(4);
	s1.insert(2);
	s1.insert(9);
	s1.insert(5);//不能输入重复的,只有insert功能..set可以自动排序,默认从小到大

	set<int, mycompare>s2;
	s2 = s1;
	s2.swap(s1);

	s2.erase(1);//功能类似于list中的remove


}

查找操作

void test02(){
	set<int>s1;
	s1.insert(1);
	s1.insert(4);
	s1.insert(2);
	s1.insert(9);
	s1.insert(5);

	//find值如果找到是返回迭代器,如果找不到是返回end()的迭代器
	set<int>::iterator ret = s1.find(9);
	if (ret == s1.end()) {
		cout << "meizhaodao" << endl;

	}
	else
	{
		cout << *ret << endl;//迭代器前面都要加* 迭代器类似于指针
	}

	 ret = s1.lower_bound(3);//找到第一个>=你要查找的数值的值,也是返回迭代器。没找到也会返回end()
	 ret = s1.upper_bound(2);//找到第一个>你要查找的数值的值,也是返回迭代器没找到也会返回end()
	pair<set<int>::iterator,set<int>::iterator>ret1 = s1.equal_range(2);//返回lower_bound和upper_bound的值,pair为对组。pari<int,int>
	ret1.first;//第一个迭代器
	ret1.second;//第二个迭代器
}

set容器存入对象的操作

class person {
public:
	person(int age1,int id1) {
		this->age = age1;
		this->id = id1;
  }
public:
	int age;
	int id;
};
class mycompare1 {
public:
	bool operator()(person p1, person p2) {
		return p1.age > p2.age;
	}
};
void test03() {
	set<person,mycompare1>p;
	person p1(10, 20), p2(30, 40), p3(50, 60);
	p.insert(p1);
	p.insert(p2);
	p.insert(p3);

	for (set<person>::iterator it = p.begin(); it != p.end(); it++) {
		cout << (*it).age << " ";
	}
	cout << endl;
}

map 基于红黑树 也具有查找功能而map与multimap差别仅仅在于multiple允许一个键对应多个值。
key不可以重复

//初始化
void test01() {
		//第一个为key第二个为value
	map<int, int>map1;
	//插入数据与set一致只有insert,因为要插入两个值我们可以用pair来插入
   //第一种
	map1.insert(pair<int, int>(10, 10));
	pair<map<int,int>::iterator,bool> ret = map1.insert(pair<int, int>(10, 10));//可以用来判断是否插入
   //第二种
	map1.insert(make_pair(20, 20));
	//第三种
	map1.insert(map<int, int>::value_type(30, 30));
	//第四种
	map1[40] = 40;//如果key不存在则创建key ,如果key存在则改变原来的value值

	for (map<int, int>::iterator it = map1.begin(); it != map1.end(); it++) {
		cout << "key: " << (*it).first << "value " << (*it).second << endl;
	}
}

一些常用的查找方法

//常用查找
void test01() {
	vector<int> v1;
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}
	//基本的find查找
	vector<int>::iterator ret = find(v1.begin(), v1.end(), 5);
	if (ret == v1.end()) {
		cout << "没有找到" << endl;
	}
	else
		cout << "找到了 :" <<*ret<< endl;
}
class  Person {
public:
	Person(int i, int a) {
		this->age = a;
		this->id = i;
	}
	bool operator ==(const Person& p) const{//要加const我也不懂为啥
		return this->id == p.id && this->age == p.age;
	}
public:
	int id;
	int age;

};

void test02() {
	vector<Person>v;
	Person p1(10, 20), p2(30, 40), p3(50, 60);
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);

	vector<Person>::iterator ret = find(v.begin(), v.end(), p1);
	if (ret == v.end()) {
		cout << "没有找到" << endl;
	}
	else
		cout << "找到了 :" << (*ret).id << endl;
}
bool Mysearch(int val) {
	return val > 5;
}
//binary_search 二分查找法 返回bool类型
void test03() {
	vector<int> v1;
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}
	v1.push_back(9);
	bool ret = binary_search(v1.begin(), v1.end(), 5);
	if (ret == false) {
		cout << "没有找到" << endl;
	}
	else
		cout << "找到了" << endl;

	//查找相邻重复元素
	vector<int>::iterator  it = adjacent_find(v1.begin(), v1.end());
	if (it != v1.end()) {
		cout << "找到了相邻重复元素" << *it << endl;

	}
	else
		cout << "没找到相邻重复元素" << endl;

	//find_if  找符合Mysearch要求的元素,返回第一个满足条件的迭代器,找不到就返回。end()
	find_if(v1.begin(), v1.end(), Mysearch);
	//count count_if
	count(v1.begin(), v1.end(), 9);//统计9出现的次数,返回int个数
		//count_if 与 find_if同理
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值