C++ STL 使用总结
来源:互联网 发布:我好想你网络歌手 编辑:程序博客网 时间:2024/05/16 12:10
相对于c,c++的标准模板库也就是STL通过了很多丰富的数据结构和算法,熟练运用能给编程带来极大的方便,下面介绍STL中常用数据结构的简单用法,全都是泛型结构,但涉及的比较关系的时候请重载<运算符号。
不定长数组vector:
#include <vector>#include <algorithm>#include <iostream>using namespace std;int main(int argc, char const *argv[]){ vector<int> v; for (int i = 1; i < 15; i++) v.push_back(i);//push_back()向尾部插入元素 v.insert(v.begin(), 99);//在头部插入元素,注意第一个参数是迭代器,不是小标,用begin() + i就能很容易表示下标了 cout << "front = " << v.front() << endl;//得到头部元素 cout << "back = " << v.back() << endl;//得到尾部元素 v.pop_back();//删除尾部元素,可以用来模拟栈,不过STL已经提供了栈 v.erase(v.begin() + 2);//删除第二个元素,参数同样是迭代器 int a[5] = {4,7,2,1,9};//定义一个数组 v.assign(a, a + 5);//批量赋值,参数为数组的起始指针和结束指针,或者是一对迭代器 cout << "reassign values: ";//使用迭代器输出 for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter) cout << *iter << " "; cout << endl; sort(v.begin(), v.end());//调用sort函数对其排序,默认是升序的,可以用reverse函数逆转 reverse(v.begin(), v.end());//反转vector,得到降序的列表 return 0;}
定义PERSON结构体,后面使用
struct PERSON{ int age; string name; PERSON(int a, string b) : age(a), name(b){} int operator< (const PERSON b) const//重载比较运算符,注意是常函数。加const关键词 { return age < b.age; }};
集合set:STL中的集合是有序的,并且保存没有重复元素。
#include <set>#include <algorithm>#include <iostream>using namespace std;int main(int argc, char const *argv[]){ PERSON p1 = PERSON(12, "abc");//定义几个person变量 PERSON p2 = PERSON(34, "kha"); PERSON p3 = PERSON(65, "dre"); PERSON p4 = PERSON(32, "kads"); set<PERSON> pset;//注意set没有重载[],不能通过下标访问 pset.insert(p1); pset.insert(p2); pset.insert(p3); //set 的size()函数输出唯一元素的个数 cout << "size = " << pset.size() << endl; for (set<PERSON>::iterator iter = pset.begin(); iter != pset.end(); ++iter) cout << iter->age << " " << iter->name << endl; PERSON p5 = PERSON(19, "p4"); if (pset.count(p5))//输出集合容量 cout << p5.name << " in the set" << endl; else cout << p5.name << " not in the set" << endl; pset.erase(pset.begin());//删除头部元素 for (set<PERSON>::iterator iter = pset.begin(); iter != pset.end(); ++iter) cout << iter->age << " " << iter->name << endl; return 0;}
pair:使用map之前先看看pair,实际上map容器的每个单元是一个pair变量,pair包含两个值,使用first和second访问。
pair<int, string> pa(1, "one");//定义 cout << pa.first << "==" << pa.second << endl;//访问
map,即key-value。同样map也是有序容器,并且保证不会出现两个同样的key,在重复插入某个同样的值的时候只会插入第一个元素,后面的直接被省略,提供count函数,判断是否存在某个key,提供find函数返回目标键值对的迭代器,细节见代码:
#include <map>#include <algorithm>#include <iostream>using namespace std;int main(int argc, char const *argv[]){ map<string, int> books;//定义变量 //使用下标的形式向map中插入 books["java"] = 12; books["c++"] = 45; books["assemble"] = 34; books["vb"] = 14; books.insert(pair<string, int>("java", 134));//使用insert函数插入 books.insert(pair<string, int>("python", 67)); //使用迭代器输出数据 for (map<string, int>::iterator iter = books.begin(); iter != books.end(); ++iter) cout << iter->first << " " << iter->second << endl; if (books.count("java"))//count函数可以检查是否存在目标key cout << "java in" << endl; else cout << "java not in" << endl; //find()函数则返回目标key的迭代器 return 0;}
tuple:引用头文件map,类似于python中的tuple,但是远远不如python中的强大,可以把tuple当成不用定义的结构体快速使用,tuple可以定义任意个元素,值得注意的是获取其元素时的代码写法,个人认为有点奇葩。
#include <map>#include <iostream>using namespace std;int main(int argc, char const *argv[]){ tuple<string, int, char> tp1("xy", 21, 'F');//定义数据类型分别是string,int,char cout << get<0>(tp1) << endl;//访问第一个元素 cout << get<1>(tp1) << endl;//访问第二个元素 cout << get<2>(tp1) << endl;//访问第三个元素 return 0;}
stack,栈:这个不再多说,在看这篇文章说明stack特性你肯定已经知道的很清楚了,直接上代码
#include <stack>#include <iostream>using namespace std;int main(int argc, char const *argv[]){ stack<int> s; s.push(2); s.push(3); s.push(5); s.push(10); s.push(78);//上述元素依次入栈 cout << s.size() << endl;//获取栈的元素个数 int t = s.top();//获取栈顶元素 cout << t << endl; s.pop();//删除栈顶,注意的是该函数的返回值是void while (!s.empty())//使用循环清空栈,empty()函数测试容器是否为空,STL中基本所有类型都提供了empty()函数 { cout << s.top() << endl; s.pop(); } return 0;}
queue,队列
#include <queue>#include <iostream>using namespace std;int main(int argc, char const *argv[]){ queue<int> que; que.push(1); que.push(11); que.push(111); que.push(1111);//入队 cout << que.front() << endl;//获取队前元素 que.pop();//删除头部元素, cout << que.front() << endl; cout << que.size() << endl; return 0;}
priority_queue,优先级队列,默认最小的元素优先级最高,使用自定义的类型请定义一个结构体重载"()"运算符,并传递相关参数,代码中我们使用自定义类型做为演示代码。
首先定义一个结构体,并在其中重载"()"运算符,具体为什么我也还没研究过,所有大家自行探索吧
struct pcmp{ bool operator() (const PERSON a, const PERSON b)//参数为目标数据类型,这里使用上述定义的PERSON结构体 { return a.age < b.age;//在函数中返回笔记值,类似于重载小于符号运算符, }};
优先级队列代码:
#include <queue>#include <vector>#include <iostream>using namespace std;int main(int argc, char const *argv[]){ //参数分别是:数据类型 vector容器 重载()的结构体 priority_queue<PERSON, vector<PERSON>, pcmp> pque; pque.push(PERSON(34, "A")); pque.push(PERSON(42, "df")); pque.push(PERSON(83, "easd")); pque.push(PERSON(2, "Bdfe")); //优先级队列获取元素使用top(),至于为什么,我想应该与实现有关,请自行查阅数据结构"堆" cout << pque.top().age << " : " << pque.top().name << endl;//输出“83 :easd pque.pop();//删除元素 cout << pque.top().age << " : " << pque.top().name << endl;//输出"42 : df" return 0;}
1 0
- c++STL总结
- C++STL一般总结
- STL使用总结
- STL容器使用总结
- C++ STL 使用总结
- STL容器使用总结
- STL使用总结
- C++ STL 使用总结
- STL使用总结
- STL使用总结
- C++ STL使用总结
- STL使用总结
- stl使用总结
- STL使用总结
- C STL Qsort使用
- c++STL基本使用
- c++STL容器使用
- 【C++】STL容器的总结
- NSArray输出到控制台中文乱码解决方
- linux epoll 练习(服务器端)
- POJ - 1961 Period(水)
- 夜深,入睡
- leetcode_num165_Compare Version numbers
- C++ STL 使用总结
- Boost.Asio基础(五) 异步编程初探
- linux 分析进程占用CPU过高
- Maven 项目不打包 *.hbm.xml 映射文件
- SlidingMenu常用属性设置记录
- poj 3390 Print Words in Lines 动态规划
- Unity3D 里IK手柄的用运
- 两个页面之间Bundle传值
- 正则表达式笔记