Love and then do

相对于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;elsecout << 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函数可以检查是否存在目标keycout << "java in" << endl;elsecout << "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,charcout << 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();//删除栈顶,注意的是该函数的返回值是voidwhile (!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,优先级队列,默认最小的元素优先级最高,使用自定义的类型请定义一个结构体重载"()"运算符,并传递相关参数,代码中我们使用自定义类型做为演示代码。待人对事不要太计较,如果太计较就会有悔恨!

Love and then do

相关文章:

你感兴趣的文章:

标签云: