一.STL: standard template library(C++标准模板库)
- STL共有六大组件:容器、算法、迭代器、仿函数、适配器、空间配置器
- 容器:各种数据结构,如vector、list、deque、stack、set、map等用来存放数据,从实现来看,STL容器是一种class template
- 算法:各种常用的算法,如sort find copy for_each,从实现角度看,STL算法是一种function template
- 迭代器:扮演了容器与算法之间的胶合剂,共有五种类型。从实现角度来看,迭代器是一种将operator* operator-> operator++ operator--等指针相关操作予以重载的class template。所有的STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针也是一种迭代器
- 仿函数(函数对象): 行为类似函数,可作为算法的某种策略。从实现角度看,仿函数是一种重载了operator()的class 或者 class template
- 适配器: 一种用来修饰容器或者仿函数或者迭代器接口的东西
- 控件配置器:负责空间的配置与管理。从实现角度看,配置器是一个实现了空间动态配置 空间管理 空间释放的class template
二.vector 向量
//
// main.c
// cdemo
//
// Created by liyongkai on 2021/6/6.
//
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, const char * argv[]) {
vector<int> v;//声明一个容器,这个容器里面存放int类型数据
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
//利用迭代器,遍历容器中的数据
vector<int>::iterator itBegin = v.begin(); //itBegin指的是v容器中的起始位置
vector<int>::iterator itEnd = v.end(); //itEnd指的是v容器中的最后一个位置的下一个地址
while (itBegin != itEnd) {
cout << *itBegin << endl;
itBegin ++;
}
return 0;
}
//
// main.c
// cdemo
//
// Created by liyongkai on 2021/6/6.
//
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void myPrint(int v){cout << v << endl;}
int main(int argc, const char * argv[]) {
vector<int> v;//声明一个容器,这个容器里面存放int类型数据
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
//利用迭代器,遍历容器中的数据
vector<int>::iterator itBegin = v.begin(); //itBegin指的是v容器中的起始位置
vector<int>::iterator itEnd = v.end(); //itEnd指的是v容器中的最后一个位置的下一个地址
for_each(itBegin, itEnd, myPrint);
return 0;
}
三.练习
//
// main.c
// cdemo
//
// Created by liyongkai on 2021/6/6.
//
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
using namespace std;
class Person {
public:
Person(string name, int sorce){
this->name = name;
this->sorce = sorce;
};
string name;
int sorce;//平均分
};
void createPerson(vector<Person> &v) {
string names = "ABCDE";
for (int i = 0; i < 5; i ++) {
string name = "选手";
name += names[i];
int sorce = 0;
Person p(name, sorce);
v.push_back(p);
}
};
void setScore(vector<Person> &v){
for(vector<Person>::iterator it = v.begin(); it!=v.end(); it ++) {
//对5个人进行打分
deque<int> d;
for (int i = 0; i < 10; i ++) {
int score = rand()%41 + 60; // 60-100
d.push_back(score);
}
//排序,默认从小到大
sort(d.begin(), d.end());
//打印
for (deque<int>::iterator dit = d.begin(); dit!=d.end(); dit++) {
cout << "打分" << *dit << " ";
}
//去除最高和最低
d.pop_back();
d.pop_front();
//计算平均值
int sum = 0;
for (deque<int>::iterator dit = d.begin(); dit!=d.end(); dit++) {
sum += *dit;
}
int avg = sum/d.size();
cout << "------->平均分为" << avg;
cout << endl;
//赋值
(*it).sorce = avg;
}
}
int main(int argc, const char * argv[]) {
//创建容器,存放选手
vector<Person>v;
//创建5名选手,放入v中
createPerson(v);
//打分
setScore(v);
//打印测试下
for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
cout << (*it).name << "的分数是" << (*it).sorce << endl;
}
return 0;
}
打分62 打分62 打分69 打分72 打分74 打分78 打分80 打分85 打分95 打分98 ------->平均分为76
打分60 打分72 打分73 打分80 打分83 打分90 打分93 打分97 打分97 打分97 ------->平均分为85
打分60 打分62 打分67 打分69 打分77 打分80 打分80 打分88 打分89 打分95 ------->平均分为76
打分60 打分61 打分64 打分70 打分71 打分76 打分78 打分86 打分88 打分92 ------->平均分为74
打分66 打分67 打分68 打分71 打分71 打分80 打分90 打分94 打分94 打分98 ------->平均分为79
选手A的分数是76
选手B的分数是85
选手C的分数是76
选手D的分数是74
选手E的分数是79
四.deque容器
两端插值,常系数时间
五.stack容器
栈,你懂得
六.queue容器
额,就是队列
七.list容器
相当于可变数组
八.set容器
就是集合
九.map容器
就是字典啊
十.pair对组
字典用的到
十一.谓词
- 谓词是指普通函数或者重载的operator()返回值是bool类型的函数对象(仿函数)
一元谓词:接收1个参数
二元谓词:接收2个参数
十二.内建函数对象
#include <functional>
int main(int argc, const char * argv[]) {
//取反
negate<int>n;
cout << n(10) << endl;//-10
//相加
plus<int>p;
cout << p(1,2) << endl;//3
return 0;
}
十三.适配器
先bind2nd
后继承class Person : public binary_function
网友评论