C++标准模板库STL学习总结

STL提供了一组表示容器、迭代器、函数对象和算法的模板。
STL是一种泛型编程。面向对象编程关注的是编程的数据方面,而泛型编程关注的是算法。它们之间的共同点是创建可重用的代码。泛型编程旨在编写独立于数据类型之外的代码。
首先是处理容器的算法,尽可能使用通用的术语来表达算法,使之独立于数据类型和容器类型。

迭代器

迭代器是一个广义指针,它可以是指针,也可以是一个可对其执行类似指针操作(如解引用和递增)的对象。通过指针广义化为迭代器,让STL能够为不同的容器类提供统一的接口。

迭代器使用示例:
使用C++11的自动类型推断

auto pd2 = scores.begin();

清空容器

//方法1
//scores.erase(scores.begin(), scores.end());
//方法2
scores.clear();

push_back()—将元素添加到矢量末尾

scores.push_back(8.8);

erase(it1,it2)—接收两个迭代器参数,删除区间:[it1,it2),删除元素从it1到it2,但不包括it2

scores.erase(scores.begin(), scores.begin() + 2);

insert()—插入元素,接收三个迭代器参数:第一个是新元素的插入位置,第二个和第三个定义被插入区间,该区间通常是另一个容器对象的一部分

scores = { 1,2,3,4,5,6.6,7.7 };
vector<double> new_v = {0.2,0.6,0.7,0.8};
scores.insert(scores.begin() + 3, new_v.begin() + 1, new_v.end());

swap()—交换两个容器的内容

scores.swap(new_v);
//使用拷贝函数生成副本
vector<double> oldlist(scores);
#include <iostream>
#include<string>
#include<vector>
using namespace std;
int main(void) {
	//为vector类的double类型声明一个迭代器:
	vector<double>::iterator pd;
	vector<double> scores = {1,2,3,4,5,6.6,7.7};
	//迭代器的行为就像指针
	pd = scores.begin();
	*pd = 23.3;
	++pd;
	//使用C++11的自动类型推断
	auto pd2 = scores.begin();
	//push_back()---将元素添加到矢量末尾
	scores.push_back(8.8);
	//erase(it1,it2)---接收两个迭代器参数,删除区间:[it1,it2),删除元素从it1到it2,但不包括it2
	scores.erase(scores.begin(), scores.begin() + 2);
	//使用迭代器遍历容器
	cout << "scores:" << endl;
	for (pd = scores.begin(); pd != scores.end(); pd++)
	{
		cout << *pd<<"  " ;
	}
	cout << "" << endl;
	//清空容器
	//方法1
	//scores.erase(scores.begin(), scores.end());
	//方法2
	scores.clear();

	cout << "scores.size(): "<<scores.size() << endl;

	//insert()---插入元素,接收三个迭代器参数:
	//第一个是新元素的插入位置,第二个和第三个定义被插入区间,该区间通常是另一个容器对象的一部分
	scores = { 1,2,3,4,5,6.6,7.7 };
	vector<double> new_v = {0.2,0.6,0.7,0.8};
	scores.insert(scores.begin() + 3, new_v.begin() + 1, new_v.end());
	cout << "insert:" << endl;
	for (pd = scores.begin(); pd != scores.end(); pd++)
	{
		cout << *pd << "  ";
	}
	cout << "" << endl;
	//swap()---交换两个容器的内容
	scores.swap(new_v);
	cout << "After swapping:" << endl;
	for (pd = scores.begin(); pd != scores.end(); pd++)
	{
		cout << *pd << "  ";
	}
	cout << "" << endl;
	//使用拷贝函数生成副本
	vector<double> oldlist(scores);
	for (pd = oldlist.begin(); pd != oldlist.end(); pd++)
	{
		cout << *pd << "  ";
	}
	cout << "" << endl;
	return 0;
}
/*
结果:
scores:
3  4  5  6.6  7.7  8.8
scores.size(): 0
insert:
1  2  3  0.6  0.7  0.8  4  5  6.6  7.7
After swapping:
0.2  0.6  0.7  0.8
0.2  0.6  0.7  0.8
*/

for_each()函数

接收三个参数,前两个是定义容器中区间的迭代器,最后一个是指向函数的指针(更普遍地说,最后一个参数是一个函数对象)。for_each()函数应用于容器区间的各个元素,被指向的函数不能更改容器元素的值。可以用for_each()代替for循环,

void showData(const double & d){
		cout << d << "  ";
}
	for (pd = scores.begin(); pd != scores.end(); pd++)
	{
		showData(*pd);
	}

可以用for_each()代替:

void showData(const double & d){
		cout << d << "  ";
}
for_each(scores.begin(),scores.end(),showData);

random_shuffle()函数

接受两个指定区间的迭代器参数,并随机排列该区间的元素。

random_shuffle(scores.begin(),scores.end());

基于范围的for循环(C++11)

double prices[5] = {1,2,3,4,5,6};
for(double x:prices)
	cout<<x<<endl;
for(auto x : scores)
	showData(x);

不同于for_each(),基于范围的for循环可以修改容器的内容,诀窍是指定一个引用参数。

for(auto & x : scores)
	showData(x);

容器

容器概念

容器是存储其他对象的对象。被存储的对象必须是同一类型。
X表示容器类型,T表示存储在容器中的对象类型。
在这里插入图片描述
在这里插入图片描述

序列

七种STL容器类型(deque、C++11新增的forward_list、list、queue、priority_queue、stack和vector)都是序列。序列要求其元素按严格的线性顺序排列,数组和链表都是序列,但分支结构不是。
t表示类型为T的值,n表示整数,p、q、i和j表示迭代器。
在这里插入图片描述
在这里插入图片描述

函数对象

函数对象时重载了()运算符(即定义了operator()()方法)的类,可以使用函数表示法来调用这种类的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SOC罗三炮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值