C++ CLT中的容器以及仿函数和谓词~

阅读: 评论:0

C++ CLT中的容器以及仿函数和谓词~

C++ CLT中的容器以及仿函数和谓词~

C++ CLT中的容器以及简单谓词~

  • vector容器
  • 栈(stack) 容器
  • 队列(queue) 容器
  • 优先级队列(priority_queue)
  • list 容器
  • set 容器
  • 仿函数
  • 谓词
  • map
  • multimap

vector容器

#include <vector> //必要导包
//TODO vector 容器vector<int> vector1;vector<int> vector2(10);//指定 10 个大小空间vector<int> vector3(10, 2);//指定 10 个大小空间每个值都是 2vector1.insert(vector1.begin(), 23);vector1.insert(vector1.begin(), 52);vector1.insert(vector1.begin(), 13);vector1.insert(vector1.begin(), 12);vector1.d(), 142);//更改第一个位置得值vector1.front() = 111;cout << "vector 第一个值为:" << vector1.front() << endl;//更改最后一个位置得值vector1.back() = 22;cout << "vector 最后一个值为:" << vector1.back() << endl;for (int i = 0; i < vector1.size(); ++i) {cout << "vector 当前 item值为:" << vector1[i] << endl;}

运行结果为:

vector 第一个值为:111
vector 最后一个值为:22
vector 当前 item值为:111
vector 当前 item值为:13
vector 当前 item值为:52
vector 当前 item值为:23
vector 当前 item值为:22
  • vector1.begin() 插入到开始的位置
  • vector1.front() 第一个值(可以更改)
  • vector1.back() 最后一个值(可以更改)
  • vector1.insert(位置,值) 存放元素

栈(stack) 容器

	stack<int> stack;stack.push(23);stack.push(22);stack.push(51);stack.push(12);stack.push(92);//判断栈内是否有元素存在while (!pty()) {//输出第一个栈内元素auto stackint = p();cout << "stack 栈内元素为:" << stackint << endl;//弹栈stack.pop();//注意:弹栈之后栈内元素被释放}

运行结果为:

stack 栈内元素为:92
stack 栈内元素为:12
stack 栈内元素为:51
stack 栈内元素为:22
stack 栈内元素为:23

队列(queue) 容器

queue<int> queue;queue.push(42);queue.push(12);queue.push(22);queue.push(51);queue.push(56);while (!pty()) {//获取第一个元素auto queueint = queue.front();cout << "queue 当前元素为:" << queueint << endl;queue.pop();}

运行结果为:

queue 当前元素为:42
queue 当前元素为:12
queue 当前元素为:22
queue 当前元素为:51
queue 当前元素为:56

使用和 vector方法类似:

  • queue.front(); 第一个元素
  • queue.back(); 最后一个元素
  • queue.pop(); 消费元素

优先级队列(priority_queue)

优先级队列内部封装了 vector
默认写法:(默认是从大到小排序):

	priority_queue<int> priorityQueue;priorityQueue.push(42);priorityQueue.push(24);priorityQueue.push(12);priorityQueue.push(522);priorityQueue.push(6);while (!pty()) {auto priorityQueueint = p();cout << "priority_queue优先级队列元素为:" << priorityQueueint << endl;priorityQueue.pop();//和前边的一样,消费了就没了}

结果:

priority_queue优先级队列元素为:522
priority_queue优先级队列元素为:42
priority_queue优先级队列元素为:24
priority_queue优先级队列元素为:12
priority_queue优先级队列元素为:6

隐式代码:

priority_queue<int> priorityQueue;  == priority_queue<int, vector<int>, less<>> priorityQueue;

从小到大排序:

priority_queue<int, vector<int>, greater<>> priorityQueue;//从小到大排列(注意第三个参数!)priorityQueue.push(42);priorityQueue.push(24);priorityQueue.push(12);priorityQueue.push(522);priorityQueue.push(6);while (!pty()) {auto priorityQueueint = p();cout << "priority_queue优先级队列元素为:" << priorityQueueint << endl;priorityQueue.pop();//和前边的一样,消费了就没了}

运行结果:

priority_queue优先级队列元素为:6
priority_queue优先级队列元素为:12
priority_queue优先级队列元素为:24
priority_queue优先级队列元素为:42
priority_queue优先级队列元素为:522

list 容器

	list<int> list;//插入到最前面list.insert(list.begin(), 12);list.insert(list.begin(), 22);list.insert(list.begin(), 5);list.insert(list.begin(), 122);list.insert(list.begin(), 54);//插入到最后面list.d(), 54);list.front() = 11;cout << "list 第一个元素为:" << list.front() << endl;list.back() = 11;cout << "list 最后一个元素为:" << list.back() << endl;/***  list.begin() 获取第一个元素*  d()  最后一个元素*  auto = std::list<int>::iterator*/for (std::list<int>::iterator it = list.begin(); it != d(); it++) {cout << "list 容器元素为:" << *it << endl;}//删除第一个元素ase(list.begin());for (std::list<int>::iterator it = list.begin(); it != d(); it++) {cout << "list 删除后元素为:" << *it << endl;}

运行结果:

list 第一个元素为:11
list 最后一个元素为:11
list 容器元素为:11
list 容器元素为:122
list 容器元素为:5
list 容器元素为:22
list 容器元素为:12
list 容器元素为:11
list 删除后元素为:122
list 删除后元素为:5
list 删除后元素为:22
list 删除后元素为:12
list 删除后元素为:11

用法和 vector 都类似

set 容器

采用红黑树的模式,会对你存入的数据排序,但是不允许数据相同

也可以从大到小或从小到大排序;

//默认
//    set<int ,less<int>> set;//从小到大排序set<int ,greater<int>> set1;//从大到小排序set1.insert(set1.begin(),123);set1.insert(set1.begin(),1);set1.insert(set1.begin(),42);set1.insert(set1.begin(),21);set1.d(),21);for (auto it = set1.begin(); it!= d(); it++) {cout << "set 元素为:" << *it << endl;}//set 容器插入元素//和 kotlin 和 C++中的 pair 一样//auto = pair<set<int , less<int>>::iterator , bool>//charu.first  返回的是第一个元素(iterator)//charu.second 返回的是第二个元素(bool)auto charu = set1.insert(51);//这里元素不能插入相同的!!!//charu.second判断容器中是否有插入的元素if (charu.second){cout << "set 容器插入成功" << endl;}else{cout << "set 容器插入失败" << endl;}

运行结果:

set 元素为:123
set 元素为:42
set 元素为:21
set 元素为:1
set 容器插入成功

仿函数

在类中,重载()的函数叫仿函数

仿函数例子:

#include <algorithm>//for_each 算法包class ShowForEach {
public:void operator()(string pInt) {cout << "for_each方式二元素为:" << pInt << endl;}
};set<string, less<string>> set1;set1.insert(set1.begin(), "set元素 1");set1.insert(set1.begin(), "set元素 2");set1.insert(set1.begin(), "set元素 3");set1.insert(set1.begin(), "set元素 4");set1.insert(set1.begin(), "set元素 5");for_each(set1.begin(), d(), ShowForEach());

注意:这里的for_each()调用的是系统算法包中的函数,下一章:C++ 算法包有讲

运行结果为:

for_each方式二元素为:set元素 1
for_each方式二元素为:set元素 2
for_each方式二元素为:set元素 3
for_each方式二元素为:set元素 4
for_each方式二元素为:set元素 5

谓词

什么是谓词:

从上面的容器中可以看出,上面比较的都是 int 类型(基本类型),谓词是用来比较对象的,返回 bool 类型的仿函数叫谓词

参数有几个就成为几元谓词,例如有 2 个参数;成为 二元谓词

系统谓词:

 set<int ,greater<int>> set1;//从大到小排序

set 集合中,第二个参数就是谓词,其他几个都一样

谓词的格式:

struct 结构体别名 {bool operator()(参数列表) {return ;}
};

自定义谓词:

#include <iostream>
#include <set>using namespace std;class Student {
public:string name;int id;Student(string name, int id) : name(name), id(id) {}
};struct sort1 {//TODO 自定义谓词 从小到大排序bool operator()(const Student &student1, const Student &student2) {return student1.id < student2.id;}
};struct sort2 {//TODO 自定义谓词 从大到小排序bool operator()(const Student &student1, const Student &student2) {return student1.id > student2.id;}
};int main() {//TODO 谓词//上面的容器都是比较基本类型 谓词是用来自定义容器来比较对象的!
//    set<Student,less<Student>,bool> setVar1;
//    set<Student,less<Student>> setVar2;
//    set<Student> setVar3;//自定义谓词set<Student, sort1> setVar4;//(从小到大排序)
//    set<Student, sort2> setVar4;(从大到小排序)Student st1("张三1", 122);Student st2("张三2", 12);Student st3("张三3", 32);Student st4("张三4", 242);Student st5("张三5", 3);setVar4.insert(st1);setVar4.insert(st2);setVar4.insert(st3);setVar4.insert(st4);setVar4.insert(st5);for (auto it = setVar4.begin(); it != d(); it++) {std::cout << it->id << "t" << it->name << endl;}return 0;
}

map

	#include <map>//map容器必要导包map<int, string> map1;//map 存放元素方式一map1.insert(map1.begin(), pair<int, string>(1, "map 元素1"));map1.insert(map1.begin(), pair<int, string>(2, "map 元素2"));map1.insert(map1.begin(), pair<int, string>(3, "map 元素3"));//map 存放元素方式二map1[4] = "map 元素4";map1[4] = "覆盖元素 4";for (map<int, string>::iterator it = map1.begin(); it != d(); it++) {std::cout << it->second << endl;}

map容器特点:
map 容器是通过 key,value 存放元素的,如果 key 相同,那么就会覆盖掉上一个元素!

运行结果:

map 元素1
map 元素2
map 元素3
覆盖元素 4

multimap

multimap<int ,string> multimap1;multimap1.insert(multimap1.begin(),pair<int,string>(1,"multimap1"));multimap1.insert(multimap1.begin(),pair<int,string>(1,"multimap2"));multimap1.insert(multimap1.begin(),pair<int,string>(1,"multimap4"));multimap1.insert(multimap1.begin(),pair<int,string>(1,"multimap5"));multimap1.insert(multimap1.begin(),pair<int,string>(1,"multimap3"));//    multimap1[2] = "multimap6";for (multimap<int, string>::iterator it = multimap1.begin(); it != d(); it++) {std::cout << it->second << endl;}

multimap特点:
和 map 相反,不会因为 key 相同而覆盖掉相同的值

运行结果:

multimap3
multimap5
multimap4
multimap2
multimap1

下一篇:C++ 算法包(find/find_if,for_each,transform,count/count_if,merge,sort,copy,replace)简单使用

原创不易,您的点赞就是对我最大的支持~

本文发布于:2024-01-30 03:34:42,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170655688418941.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:中心极限定理
标签:谓词   容器   函数   CLT
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23