目录
- 1.C++ vector向量
- 2.C++ stack 栈
- 3.C++ queue 队列
- 4.优先级队列
- 5.C++ list
- 6.c++ set 集合
- 7.C++ map函数
- 8.C++ multimap容器
- 9.C++ 谓词
- 10.C++内置预定义函数
C++ STL(Standard Template Library标准模板库),相当于java的集合模块, STL 有很多的容器。
1.C++ vector向量
(内部:封装动态大小数组作为容器,能够存放任意的动态数组)
#include <iostream>
#include <vector> // 引入 vector 容器的支持
// NDK 开发 一定要用容器 应该 queue 队列
using namespace std;
int main() {
vector<int> vector;
vector<int> vector(10); // 指定10的空间大小
vector<int> vector(10, 0); // 有了10个值了 每个值都是0
vector<int> vector;
// 插入数据
vector.insert(vector4.begin(), 40);
vector.insert(vector4.begin(), 60);
vector.insert(vector4.begin(), 80);
// 第一个
cout << " 修改前:vector.front():" << vector4.front() << endl;
vector.front() = 99; // 默认修改第一个
cout << " 修改后:vector.front():" << vector4.front() << endl;
// 最后一个
cout << " 修改前:vector.back():" << vector4.back() << endl;
vector.back() = 777; // 默认修改最后
cout << " 修改后:vector.back():" << vector4.back() << endl;
vector.erase(vector4.begin()); // 移除第一个元素(内部:通过迭代器的位置 进行移除) 删除
// 循环打印,默认 从大到小输出
for (int i =; i < vector4.size(); ++i) {
cout << "item:" << vector[i] << endl;
}
// 迭代器 循环遍历
// auto Kotlin自带类型推到
// for (vector<int>::iterator iteratorVar = vector.begin(); iteratorVar != vector4.end(); iteratorVar++) {
for (auto iteratorVar = vector.begin(); iteratorVar != vector4.end(); iteratorVar++) {
// 迭代器 当中指针操作 iteratorVar++
cout << "迭代器:" << *iteratorVar << endl;
}
cout << "" << endl;
return;
}
- vector4.begin() 迭代器 插入到前面
- vector4.end() 迭代器 插入到后面
2.C++ stack 栈
#include <stack>
using namespace std;
int main() {
stack<int> stackVar;
stackVar.push();
stackVar.push();
stackVar.push();
while (!stackVar.empty()) {
int top = stackVar.top(); // top == 获取栈顶的元素
cout << "获取栈顶的元素:" << top << endl; // 永远拿
stackVar.pop(); // 把栈顶的元素 弹出去 【删除】
}
return;
}
栈没有迭代器,不能指定位置压栈等
3.C++ queue 队列
#include <queue>
using namespace std;
int main() {
queue<int> queueVar;
queueVar.push();
queueVar.push();
queueVar.push();
// 第一个元素
cout << " 修改前: queueVar.front():" << queueVar.front() << endl;
queueVar.front() =;
cout << " 修改后: queueVar.front():" << queueVar.front() << endl;
// 最后一个
cout << " 修改前: queueVar.back():" << queueVar.back() << endl;
queueVar.back() =;
cout << " 修改后: queueVar.back():" << queueVar.back() << endl;
while (!queueVar.empty()) {
cout << "while:" << queueVar.front() << endl;
queueVar.pop(); // 把前面的元素 给消费掉 【删除】
}
return;
}
queue队列内部是通过数组和链表实现的,这个数据结构应用场景比较多,音视频编解码啥的都会用到,遵守FIFO 原则。
4.优先级队列
#include <iostream>
#include <queue>
using namespace std;
int main() {
// priority_queue<int> priorityQueue;
priority_queue<int ,vector<int>, less<int>> priorityQueue;
priorityQueue.push();
priorityQueue.push();
priorityQueue.push();
priorityQueue.push();
priorityQueue.push();
priorityQueue.push();
cout << priorityQueue.top() << endl; //
// 循环代码
while (!priorityQueue.empty()) {
cout << "while:" << priorityQueue.top() << endl;
priorityQueue.pop(); // 最前面的元素消费掉
}
return;
}
- priority_queue 内部对我们前面的vector 有一定的封装
- 优先级队列会自动进行排序操作
- priority_queue priorityQueue:这样声明优先级队列,相当于priority_queue<int ,vector, less> priorityQueue,省略了比较策略等
- less return __x < __y: 从大到小
- greater return __x > __y: 从小到大
5.C++ list
#include <iostream>
#include <list>
using namespace std;
int main() {
list<char*> listVar;
// 插入操作
listVar.push_front("唐三"); // 插入到前面 明确
listVar.push_back("小舞"); // 插入到后面
listVar.insert(listVar.begin(),"宁荣荣"); // 插入到前面 灵活
listVar.insert(listVar.end(), "马红俊"); // 插入到后面
// // 修改操作
// listVar.back() =;
// listVar.front() =;
// // 删除
// listVar.erase(listVar.begin()); // 删除最前面的
// listVar.erase(listVar.end()); // 删除最后面的
for (auto it = listVar.begin(); it != listVar.end() ; it ++) {
cout << *it << endl;
}
return;
}
- Java:ArrayList采用Object[]数组, C++的list 内部:采用链表
- 不用通过角标去访问、修改 、遍历
6.c++ set 集合
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int, less<int>> setVar;
setVar.insert();
setVar.insert();
setVar.insert();
setVar.insert();
pair<set<int, less<int>>::iterator, bool> res = setVar.insert();
bool insert_success = res.second;
if (insert_success) {
cout << "插入成功" << endl;
} else {
cout << "插入失败" << endl;
}
for (auto it = setVar.begin(); it != setVar.end() ; it ++) {
cout << *it << endl;
}
return;
}
- set(内部:红黑树结构),会对你存入的数据进行排序,不允许元素相同
- __x < __y 从小到大,默认情况下 就是 less
- 添加参数,不需要用迭代器,也不需要指定位置
- 重复插入,会提示插入失败
7.C++ map函数
#include <iostream>
#include <map>
using namespace std;
int main() {
// 注意:map会对key进行排序,默认 key不能重复
map<int, string> mapVar;
// TODO 添加数据
// 第一种方式
mapVar.insert(pair<int, string>(, "唐三"));
// 第二种方式
mapVar.insert(make_pair(, "小舞"));
// 第三种方式
mapVar.insert(map<int, string>::value_type (, "宁荣荣"));
// 上面三种方式 key不能重复
// 思考:既然会对key进行排序,那么key是不能重复的(会插入失败)
std::pair<map<int,string>::iterator ,bool> r=mapVar.insert(pair<int, string>(, "宁荣荣2")); // 注意这个方式是插入失败了
//通过pair的方式
if (r.second){
cout << "插入成功" << endl;
}else{
cout << "插入失败" << endl;
}
// 第四种方式 mapVar[key]=Value
mapVar[] = "马红俊";
mapVar[] = "比比东"; // 第四种方式覆盖/替换(常用)
/**
* typedef typename _Rep_type::iterator iterator; 之前常规的迭代器
typedef typename _Rep_type::const_iterator const_iterator; 只读的,只能读,不能修改 的迭代器
typedef typename _Rep_type::reverse_iterator reverse_iterator; 倒序打印的迭代器
*/
// 循环打印,迭代器
for (map<int, string>::iterator it = mapVar.begin() ; it != mapVar.end() ; it ++) {
cout << it->first << "," << it->second.c_str() << "\t";
}
cout << endl;
// 查找,操作
map<int, string> ::iterator findResult = mapVar.find(); // 查找
if (findResult != mapVar.end()) {
cout << "恭喜,找到了" << findResult->first << "," << findResult->second.c_str() << endl;
} else {
cout << "没找到了" << endl;
}
//删除元素
mapVar.erase(); //如果删除的元素不存在 也不会报错
// 循环打印,迭代器
for (map<int, string>::iterator it = mapVar.begin() ; it != mapVar.end() ; it ++) {
cout << it->first << "," << it->second.c_str() << "\t";
}
cout << endl;
return;
}
- 通过pair 插入数据如果id重复会插入失败,不会覆盖
- 通过mapVar[4] = "马红俊"这个方式插入数据,如果id重复会进行覆盖
- 通过erase函数删除元素,如果id不存在不会报错
8.C++ multimap容器
#include <iostream>
#include <map>
using namespace std;
int main() {
multimap<int, string> multimapVar;
multimapVar.insert(make_pair(, "十个1"));
multimapVar.insert(make_pair(, "十个2"));
multimapVar.insert(make_pair(, "十个3"));
multimapVar.insert(make_pair(, "三十1"));
multimapVar.insert(make_pair(, "三十3"));
multimapVar.insert(make_pair(, "三十2"));
multimapVar.insert(make_pair(, "二十1"));
multimapVar.insert(make_pair(, "二十2"));
multimapVar.insert(make_pair(, "二十3"));
for (auto iteratorVar = multimapVar.begin(); iteratorVar != multimapVar.end() ; iteratorVar ++) {
cout << iteratorVar->first << "," << iteratorVar->second << endl;
}
cout << endl;
int result;
cout << "请输入你要查询的key,为int类型:" << endl;
cin >> result;
multimap<int, string>::iterator iteratorVar = multimapVar.find(result);
while (iteratorVar != multimapVar.end()) {
cout << iteratorVar->first << "," << iteratorVar->second << endl;
iteratorVar++;
if (iteratorVar->first != result) {
break;;
}
// if (iteratorVar == multimapVar.end()) {
// break;
// }
}
return;
}
- multimap核心功能是分组
- multimap key可以重复,key重复的数据可以分组,key会自动进行排序
9.C++ 谓词
c++ 谓词 概念: 返回bool类型的仿函数称为谓词 。
如果operator()接受一个参数,那么叫做一元谓词 如果operator()接受两个参数,那么叫做二元谓词。
#include <iostream>
#include <set>
using namespace std;
class Person {
public:
string name;
int id;
Person(string name, int id) : name(name), id(id) {}
};
// 自定义谓词 (仿函数)
struct doCompareAction {
public:
bool operator() (const Person& __x, const Person& __y) {
return __x.id < __y.id;
}
};
struct doCompareAction {
public:
bool operator() (const Person& __x, const Person& __y) {
return __x.id > __y.id;
}
};
int main() {
set<Person, doCompareAction> setVar;
// set<Person, doCompareAction> setVar;
// 构建对象
Person p ("Snake", 1);
Person p ("kevin", 2);
Person p ("Derry", 3);
// 把构建的对象 插入到 set 容器里面去
setVar.insert(p);
setVar.insert(p);
setVar.insert(p);
for (set<Person>::iterator it = setVar.begin(); it != setVar.end() ; it ++) {
cout << it->name.c_str() << " , " << it->id << endl;
}
return;
}
- c++ Set集合,默认的谓词不能对对象类型的比较,如果set集合传入对象类型需要自定义谓词来处理
- 谓词定义的规则:定义一个结构体,bool operator() 这部分是固定格式 参数部分是两个常量引用类型数据,返回比较两个对象的维度就可以
10.C++内置预定义函数
// C++ 预定义函数(C++ 内置函数)
#include <iostream>
using namespace std;
int main() {
// "Derry" + "AAAA" // 运算符重载
// C++已经提供了 预定义函数 plus,minus,multiplies,divides,modulus ...
plus<int> add_func;
int r = add_func(, 1);
cout << r << endl;
plus<string> add_func;
string r = add_func2("AAAA", "BBB");
cout << r << endl;
plus<float> add_func;
float r = add_func3(4354.45f, 34.3f);
cout << r << endl;
return;
}