C++ CLT中的容器以及简单谓词~
vector容器
#include <vector> //必要导包
//TODO vector 容器
vector<int> vector1;
vector<int> vector2(10);//指定 10 个大小空间
vector<int> vector3(10, 2);//指定 10 个大小空间每个值都是 2
vector1.insert(vector1.begin(), 23);
vector1.insert(vector1.begin(), 52);
vector1.insert(vector1.begin(), 13);
vector1.insert(vector1.begin(), 12);
vector1.insert(vector1.end(), 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.end() 插入到后面的位置
- 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 (!stack.empty()) {
//输出第一个栈内元素
auto stackint = stack.top();
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 (!queue.empty()) {
//获取第一个元素
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 (!priorityQueue.empty()) {
auto priorityQueueint = priorityQueue.top();
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 (!priorityQueue.empty()) {
auto priorityQueueint = priorityQueue.top();
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.insert(list.end(), 54);
list.front() = 11;
cout << "list 第一个元素为:" << list.front() << endl;
list.back() = 11;
cout << "list 最后一个元素为:" << list.back() << endl;
/**
* list.begin() 获取第一个元素
* list.end() 最后一个元素
* auto = std::list<int>::iterator
*/
for (std::list<int>::iterator it = list.begin(); it != list.end(); it++) {
cout << "list 容器元素为:" << *it << endl;
}
//删除第一个元素
list.erase(list.begin());
for (std::list<int>::iterator it = list.begin(); it != list.end(); 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.insert(set1.end(),21);
for (auto it = set1.begin(); it!= set1.end(); 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(), set1.end(), 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 != setVar4.end(); 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 != map1.end(); 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 != multimap1.end(); 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)简单使用
原创不易,您的点赞就是对我最大的支持~