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
原创粉丝点击