STL初步了解

容器的概念:

序列式容器:容器的元素的位置是由进入容器的时机和地点来决定的

关联式容器:容器已有规则,进入元素由容器内规则决定。

迭代器的概念:

可以先理解为指针,对指针的基本操作都可以对迭代器进行。

但实际上迭代器是一个类。这个类封装一个指针

算法的概念:

通过有限的步骤解决问题。

分离设计:

通过一个小案例初步理解算法容器分开设计,由迭代器进行链接:

#include<iostream>
using namespace std;
//容器算法分开设计,通过迭代器链接:
int mycount(int* start,int * end,int val) //算法统计统计容器内元素的个数
{
	int num = 0;
	while (start != end)
	{
		if (*start == val)
			num++;
		start++;
	}
	return num;
}
int main()
{
	int arr[] = { 0,12,4,512,0};
	int* Abegin = arr; //迭代器开始位置
	int* Aend = &(arr[sizeof(arr) / sizeof(int)]);
	int num = mycount(Abegin, Aend, 0);
	cout << num;
}

容器-string容器:

string封装了char*,是一个char*的容器

string容器不需要考虑内存释放和越界

char*和string之间可以通过string提供的c_str()进行转换

string较为简单,个人认为需要了解的操作:

substr(int pos = 0,int n = npos)const;//返回由pos开始的n个字符组成的字符串

 容器-vector容器:

可称动态数组或者可变数组,支持随机访问,迭代器可以直接+2,-3等

迭代器除了v.begin()和v.end()之外还有v.rend(指向第一个元素的前一个位置)和v,rbegin(指向最后一个元素)

访问数组元素尽量用at,如果错误会抛出异常,[]则不会

vector容器也比较简单,需要了解下用swap函数收缩空间,以及reserve预留空间

 容器-deque容器:

 双端数组,除了尾插push_back尾删pop_back之外还有头插push_front和头删pop_front

也支持随机存储

通过小案例了解deque和vector:

#include<iostream>
#include<algorithm>
#include<vector>
#include<deque>
using namespace std;
class Person //创建选手类
{
public:
	Person();
	Person(int score, string name);
	~Person();

public:
	int Pscore;
	string Pname;
};
Person::Person()
{
	Pscore = 0;
	Pname = " ";
}
Person::Person(int score, string name):Pname(name),Pscore(score)
{
}
Person::~Person()
{
}
void SetPerson(vector<Person>& v)//创建选手
{
		string nameseed = "ABCDE";
		for(int i = 0;i<5;i++)
		{
			Person p;
			p.Pname = "选手";
			p.Pname += nameseed[i];
			p.Pscore = 0;
			v.push_back(p);
		}
}
void SetScore(vector<Person>& v) //打分
{
	for (vector<Person>::iterator it = v.begin(); it != v.end(); ++it)
	{
		deque<int>dScore;
		for (int i = 0; i < 10; ++i)
		{
			int score = rand() % 41 + 60;
			dScore.push_back(score);
		}
		dScore.pop_back();
		dScore.pop_front();
		int sumScore = 0;
		int AvgScore = 0;
		for (deque<int>::iterator itt = dScore.begin(); itt != dScore.end(); ++itt)
		{
			sumScore += (*itt);
		}
		AvgScore = sumScore / dScore.size();
		(*it).Pscore = AvgScore;
	}
}
bool Paixu(const Person& p1, const Person& p2)
{
	return p1.Pscore > p2.Pscore;
}
void Mysort(vector<Person>& v) //降序排列
{
	sort(v.begin(), v.end(), Paixu);
	for (vector<Person>::iterator it = v.begin(); it != v.end(); ++it)
	{
		cout << "姓名: " << (*it).Pname << " 得分:  " << (*it).Pscore << endl;
	}
}
int main()
{
	vector<Person>v1;
	SetPerson(v1);
	SetScore(v1);
	Mysort(v1);
}

容器-stack容器(栈容器):

不提供迭代器->不能遍历,不支持随机存取

可以返回栈顶元素

容器-queue容器(队列容器):

不提供迭代器->不能遍历,不支持随机访问

可以放回队尾或者队头元素

容器-list:

链表由一系列结点组成,结点包含数据域跟指针域。内存是非连续存储的。

链表只有在需要的时候才分配内存,链表还需要额外的空间保存结点的前驱后继关系

set/multiset容器:

set容器的元素既是键值又是实值。

基于红黑树 set容器不允许元素重复,而multiset允许

不能通过set的迭代器改变元素的值

set查找操作:

lower_bound(keyElem) //返回第一个key>=keyElem元素的迭代器

upper_bound(keyElem) //返回第一个key>keyElem元素的迭代器

equal_range(keyElem) //返回容器中key与keyElem相等的上下限的两个迭代器(就是上面两个一起返回)用对组接收

map/multimap容器:

map具有键值跟实值,所有元素根据键值排序,底层也是红黑树。

map不允许重复key,而multimap允许。

map中存的都是对组

示例:

#include<algorithm>
#include<vector>
#include<map>
#include<time.h>
#include<stdio.h>
using namespace std;
#define SALE_DEPATMENT 1//销售部门
#define DEVELOP_DEPATMENT 2//研发部门
#define FINACIAL_DEPATMENT 3//财务部门
class Worker {
public:
	string Wname;
	int Wage;
	int Wsalary;
	string Wtele;
};
void CreatWorker(vector<Worker>& v) //创建员工
{
	string nameseed = "ABCDE";
	for (int i = 0; i < 5; i++)
	{
		Worker w;
		w.Wname = "员工";
		w.Wname += nameseed[i];
		w.Wtele = "8208798";
		w.Wage = rand() % 10 + 30;
		w.Wsalary = rand() % 10000 + 10000;
		v.push_back(w);
	}
}
void WorkerBygroup(vector<Worker>& v, multimap<int, Worker>& m) //进行分组
{
	for (vector<Worker>::iterator it = v.begin(); it != v.end(); it++)
	{
		int depatID = rand() % 3+1;
		switch (depatID)
		{
		case SALE_DEPATMENT:
			m.insert(make_pair(SALE_DEPATMENT, *it));
			break;
		case  DEVELOP_DEPATMENT:
			m.insert(make_pair(DEVELOP_DEPATMENT, *it));
			break;
		case  FINACIAL_DEPATMENT:
			m.insert(make_pair(FINACIAL_DEPATMENT, *it));
			break;
		default:
			break;
		}
	}
}
void showgropuworker(int depatID, multimap<int, Worker>& m)
{
	multimap<int, Worker>::iterator it = m.find(depatID);
	int count = m.count(depatID);
	int num = 0;
	for (multimap<int, Worker>::iterator pos = it; it != m.end() && num < count; pos++, num++)
	{
		cout << "姓名: " << (*pos).second.Wname << " 年龄: " << (*pos).second.Wage
			<< "电话" << (*pos).second.Wtele << "工资: " << (*pos).second.Wsalary << endl;
	}
}
void PrintBygropu(multimap<int, Worker>& m)
{
	cout << "销售部门" << endl;
	showgropuworker(SALE_DEPATMENT, m);
	cout << "研发部门" << endl;
	showgropuworker(DEVELOP_DEPATMENT, m);
	cout << "财务部门" << endl;
	showgropuworker(FINACIAL_DEPATMENT, m);

}
int main()
{
	vector<Worker>v1;
	multimap<int,Worker>m1;
	//创建员工
	CreatWorker(v1);
	//员工分组
	WorkerBygroup(v1, m1);
	//打印员工信息
	PrintBygropu(m1);
}

初次了解STL,这条路还很长,笔记先到这吧

补充:

力扣上的题:deque、queue、vector综合解题icon-default.png?t=M5H6https://leetcode.cn/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/submissions/

非常考验STL基础

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STL(Standard Template Library)算法C++标准库中的一组通用算法,用于处理各种类型的数据结构STL算法提供了一系列函数对象和迭代器,以便能够对容器中的元素进行常见的操作,如查找、排序、删除、替换等。 STL算法主要分为以下几类: 1. 非修改性算法:这类算法不会改变容器中的元素,例如查找、计数、比较等。常用的函数包括find、count、equal等。 2. 修改性算法:这类算法会修改容器中的元素,例如排序、删除、替换等。常用的函数包括sort、remove、replace等。 3. 排序算法STL提供了多种排序算法,如快速排序、归并排序等。常用的函数包括sort、stable_sort等。 4. 数值算法:这类算法主要用于数值计算,如求和、积累、内积等。常用的函数包括accumulate、inner_product等。 5. 集合操作:这类算法主要用于集合的操作,如交集、并集、差集等。常用的函数包括set_intersection、set_union等。 STL算法的优势在于其通用性和高效性。通过使用STL算法,我们可以在不同类型的容器上进行相同的操作,避免了针对不同容器实现不同操作的麻烦。此外,STL算法的底层实现经过优化,通常比手动编写的算法更高效。 总之,STL算法C++标准库中提供的一组通用算法,用于处理各种类型的数据结构。通过使用STL算法,我们可以方便地对容器进行各种操作,提高开发效率并保证程序的高效性。 ### 回答2: STL算法C++标准模板库(Standard Template Library)中的一部分,它提供了丰富的算法操作,方便我们在处理数据时进行快速、高效的操作。 STL算法包含很多算法函数,比如排序(sort)、查找(find)、替换(replace)、去重(unique)、合并(merge)等等。这些算法函数可以处理各种数据容器,比如数组、容器、字符串等。 STL算法的使用非常方便,我们只需要包含<algorithm>头文件,并使用其中的函数即可。例如,我们可以使用sort函数对一个数组进行排序,使用find函数在容器中查找某个元素,使用replace函数替换容器中的某个值等等。 STL算法的好处是它提供了统一的接口和一致的命名规范,使得我们在处理不同的数据结构时都能使用相同的函数名来调用相应的操作。这样可以大大提高代码的复用性和可读性,减少了我们编写和维护代码的工作量。 此外,STL算法还可以通过函数对象(function object)、谓词(predicate)等机制来灵活地进行自定义操作。我们可以自定义比较函数来实现按照特定条件进行排序,或者自定义判断函数来在查找时指定特定的条件等。这样可以让我们的代码更加灵活和可扩展。 总之,STL算法C++中非常重要和强大的一部分,它提供了丰富的算法函数,方便我们在处理数据时进行各种操作。它的使用简单方便,可以提高代码的复用性和可读性,是C++开发中不可或缺的工具之一。 ### 回答3: STL(Standard Template Library,标准模板库)是C++中的一个重要部分,其中的算法部分(Algorithm)是其核心。STL Algorithm提供了一组强大的算法,用于对各种容器(如数组、向量、列表等)中的元素进行各种操作和处理。 STL算法可以分为若干类别,其中包括常用算法、排序算法、查找算法、数值算法等等。常用算法如copy(复制)、find(查找)、transform(转换)等,它们可以快速且高效地完成各种常见的操作。排序算法如sort(排序)、stable_sort(稳定排序)等,可以根据指定的规则对容器中的元素进行排序。查找算法如binary_search(二分查找)和lower_bound(寻找下界)等,可以在有序容器中快速查找指定元素。数值算法如accumulate(累加)、partial_sum(部分求和)等,用于对数值进行处理和计算。 STL的优势在于其算法的可重用性和通用性。STL Algorithm是基于模板的设计,它可以适用于不同类型的容器和元素。无论是基本数据类型还是自定义类型,只要满足一定的要求(如支持迭代器),就可以使用STL算法对其进行操作。这种通用性使得STL Algorithm可以被广泛应用于各种场景,大大提高了开发效率。 总结来说,STL算法C++中的一组强大工具,用于对各种容器中的元素进行各种操作和处理。它的通用性和可重用性使得开发者可以更加高效地完成各种任务,提高代码的可读性和可维护性。无论是在日常开发中还是在算法竞赛中,STL Algorithm都扮演着重要的角色。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值