C++容器篇(二)
2021/12/18 14:20:22
本文主要是介绍C++容器篇(二),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
list容器
#include<iostream> #include<list> #include<string> #include<functional>//less和greater的头文件 using namespace std; //操作基本数据类型 void testList() { list<int> iNum; list<string> strNum; //插入 strNum.push_back("string1"); strNum.push_back("string2"); strNum.push_front("string3"); //遍历 // 不删除的方式,用迭代器遍历 list<string>::iterator iter; for (iter = strNum.begin(); iter != strNum.end(); iter++) { cout << *iter << "\t"; } cout << endl; cout << "是否为空:" << boolalpha << !strNum.empty() << endl; cout << "当前节点个数:" << strNum.size() << endl; // 删除的方式,打印头删头 while (!strNum.empty()) { cout << strNum.front() << " ";//back() strNum.pop_front(); //头部删除strNum.pop_back(); } cout << "当前节点个数:" << strNum.size() << endl; //指定位置操作 //iterator=find(iterator begin,iterator end,data)查找 for (int i = 0; i < 3; i++) { iNum.push_back(i); } list<int>::iterator result = find(iNum.begin(), iNum.end(), 2); //可以用auto result = find(iNum.begin(), iNum.end(), 2); //若没有找到返回的是end结束的位置 if (result == iNum.end()) { cout << "未找到指定位置" << endl; } //insert iNum.insert(result, 100); for (auto v : iNum) { cout << v << "\t"; } cout << endl; //删除函数 iNum.erase(result); for (auto v : iNum) { cout << v << "\t"; } cout << endl; iNum.reverse();//反转列表 iNum.sort();//iNum.sort(greater<int>())从大到小排序默认是less<int>() for (auto v : iNum) { cout << v << "\t"; } cout << endl; } //如何做相同元素删除!!!!! void testDelete() { int array[5] = { 1,2,2,4,2 }; list<int> data; data.assign(array, array + 5); for (auto v : data) { cout << v << "\t"; } cout << endl; for (list<int>::iterator iter=data.begin(); iter != data.end();) { if (*iter == 2) { iter = data.erase(iter);//一定要返回一个接受的erase返回的是下一个迭代器 } else { iter++; } } for (auto v : data) { cout << v << "\t"; } cout << endl; } //操作自定义类型数据 class MM { public: MM(string name,int age,int num):name(name),age(age),num(num){} void print() { cout << name << "\t" << age << "\t" << num << endl; } bool operator==(const string& name)const { return this->name == name; } bool operator<(const MM& object)const { return this->name < object.name; } string getName()const {//string& getName()const错误带const就不能返回引用了,类外可修改,所以不能返回引用 return name; } protected: string name; int age; int num; }; bool compareByName(const MM& object1,const MM& object2) { return object1.getName() < object2.getName(); } void testMM() { list<MM> mmData; string name; int age; int num; while (1) { cout << "Input MM:" << endl; cin >> name >> age >> num; mmData.push_back(MM (name, age, num)); cout << "是否继续输入" << endl; while (cin.get() != '\n'); if (cin.get() == 'n') { break; } } cout << "MM的name\tage\tnum" << endl; for (auto v : mmData) { v.print(); } auto result = find(mmData.begin(), mmData.end(), string("name")); list<list<MM>::iterator> resultList; resultList.push_back(result); //采用重载的方式 mmData.sort(less<MM>());//重载< //mmData.sort(greater<int>());重载> //不采用重载的方式需要自己写比较准则 mmData.sort(compareByName);//sort的参数是一个函数指针,这样避免了同一个操作符参数一样时不能被二次重载(比如比较年龄和姓名等于号重载) } int main() { testList(); testDelete(); testMM(); return 0; }
stack栈:
#include<stack> #include<iostream> #include<string> using namespace std; void testStack() { //穿脱原则,先进后出 //push(data)入栈 //pop()删除 //top()获取栈顶元素 //size() empty() stack<int> intStack; for (int i = 0; i < 3; i++) { intStack.push(i); } while (!intStack.empty()) { cout << intStack.top()<<"\t"; intStack.pop(); } cout << endl; } //进制转换 void NumTobinary(int data) { stack<int> binaryData; while (data) { binaryData.push(data % 2); data = data / 2; } if (binaryData.size() < 8) { for (int i = binaryData.size(); i < 8; i++) { binaryData.push(0); } } while (!binaryData.empty()) { cout << binaryData.top(); binaryData.pop(); } cout << endl; //a+b中缀 //ab+后缀 //我们一般读的是中缀表达式,计算机转换成后缀表达式 } int main() { //testStack(); int data; cin >> data; NumTobinary(data); return 0; }
队列
queue/deque/priority_queue
普通队列queue:
#include<queue> #include<iostream> #include<string> using namespace std; //队列可以用来遍历二叉树 //若不想影响原容器,自己写一个函数传参不传引用,就不会影响原来的容器(拷贝本) void pop_queue(queue<int> qData) { while (!qData.empty()) { cout << qData.front() << " ";//获取队头 qData.pop(); //出队 } cout << endl; } void testQueue() {//先进先出 queue<int> qData; for (int i = 0; i < 3; i++) { qData.push(i);//入队 } while (!qData.empty()) { cout << qData.front() << " ";//获取队头 qData.pop(); //出队 } //pop_queue(qData); cout << endl; cout << qData.size() << endl; } int main() { testQueue(); return 0; }
双向队列deque
#include<deque> #include<iostream> #include<string> using namespace std; //双向队列,可以从头到尾也可以从尾到头,速度较快 void pop_front_deQueue(deque<int> dData) { while (!dData.empty()) { //从头部出来 cout << dData.front(); dData.pop_front(); } cout << endl; } void pop_back_deQueue(deque<int> dData) { while (!dData.empty()) { //从尾部出来 cout << dData.back(); dData.pop_back(); } cout << endl; } void testDeque() { deque<int> deData; for (int i = 0; i < 3; i++) { deData.push_back(i); //尾插法入队 deData.push_front(i); //头插法入队 //00 //1001 //210012 } deData.push_back(66666); pop_front_deQueue(deData); pop_back_deQueue(deData); } int main() { testDeque(); return 0; }
优先队列priority_queue
#include<queue> #include<iostream> #include<string> #include<vector> using namespace std; //优先队列是按照特定的比较方式出队 //需要一个中间容器充当优先队列的容量 /*template <class _Ty, class _Container = vector<_Ty>, class _Pr = less<typename _Container::value_type>> class priority_queue {*/ template <class _Ty, class _Container = vector<_Ty>, class _Pr = less<_Ty>> class my_priority_queue { public: protected: }; //创建方式 void testCreatePriorityQueue() { priority_queue<int> pqData1; priority_queue<int, vector<int>> pqData2; priority_queue<int, vector<int>,less<int>> pqData3;//从小的出队把less改成greater //默认从大到小出 pqData1.push(63); pqData1.push(52); pqData1.push(75); while (!pqData1.empty()) { cout << pqData1.top() << " "; pqData1.pop(); } cout << endl; } int main() { testCreatePriorityQueue(); return 0; }
这篇关于C++容器篇(二)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-29从 Elastic 迁移到 Easysearch 指引
- 2024-12-29uni-app 中使用 Vant Weapp,怎么安装和配置npm ?-icode9专业技术文章分享
- 2024-12-27Nacos多环境配置学习入门
- 2024-12-27Nacos快速入门学习入门
- 2024-12-27Nacos快速入门学习入门
- 2024-12-27Nacos配置中心学习入门指南
- 2024-12-27Nacos配置中心学习入门
- 2024-12-27Nacos做项目隔离学习入门
- 2024-12-27Nacos做项目隔离学习入门
- 2024-12-27Nacos初识学习入门:轻松掌握服务发现与配置管理