STL基础

来源:互联网 发布:057188157858是淘宝网 编辑:程序博客网 时间:2024/06/06 05:01

在开始Effective STL系列之前,有必要对STL基础进行一个全面的基础学习。
学习链接地址如下:
http://wenku.baidu.com/link?url=i6SBAotuThXbBw3Nx7pSyg84zPdVQC6m0chFzuC3DZzhlGgJcxiblzpGijIO9_u4GRbkqm9_1pDnUero8tDNJKJTl_45ZBKg6OFz89gkc67

  • STL抽象的是什么?
    有些算法并不依赖于数据结构的特定实现,而只是依赖于该结构的几个基本的语义属性,STL抽象出这些基本属性,成功的将算法与数据结构分离,在没有效率损失的前提下,得到了极大的弹性。
    如下代码:
vector<int> ivec;deque<int> ideque;//一个泛型的排序算法sort(ivec.begin(),ivec.end());sort(ideque.begin(),ideque.end());

用一个泛型算法可以处理多种数据结构。而且在获得弹性的同时运行效率上和以前相比没有损失。

  • STL的6大组件:
    容器(Container)
    算法(Algorithm)
    迭代器(Iteratior)
    仿函数(Function Object)或者称为函数对象
    适配器(Adapter)
    空间配制器(Allocator)

STL的组成:

STL组件 程序需要的头文件 Algorithms <algorithm> 四个数值相关的算法 <numberic> vector <vector> list <deque> stack <stack> queue <queue> priority queue <queue> map <map> set <set> multimap <map> multiset <set> function objects <functional> iterator adapter <iterator>

一个小程序:

template<typename T>void print_elements(T elem){    cout<<elem<<"  ";}int void main(){void(*pfi)(int) = print_elements;    list<int> lists;    lists.push_back(10);    lists.push_back(20);    bool flag = lastGreatThanFirst(lists);    map<string,double> maps;    string s = "sdwe";    cout<<s;    int ia[7] = {0,1,2,3,4,5,6};    list<int> ilist(ia,ia+7);// 因为ia也是一个迭代器,一个指针的迭代器。这个构造函数是设置了迭代器的起始和结束位置    for_each(ilist.begin(),ilist.end(),pfi);    ilist.push_back(7);    ilist.push_back(0);    ilist.push_back(7);    ilist.push_back(9);    for_each(ilist.begin(),ilist.end(),pfi);    ilist.remove_if(bind2nd(modulus<int>(),2));//去除所有奇数    for_each(ilist.begin(),ilist.end(),pfi);}

命名空间的两种使用方式:
using Rewind::i;//这是一个using declaration,他使I成为当前范围内代表Rewind::i的同义词。

using namespace Rewind;//这是一个using directive,它使Renwind内的所有名字曝光。

using namepace会再度引发名称冲突:

namespace Renwind{    int i=10;    void myGlobalFcunc();}main函数{using namespace Renwind;    int i = 1;    cout<<i<<endl;}
  • 类模板显示特化
#include <iostream>template<typename T>class CTest{public:    void operator()(){ std::cout<<"CTEST<T>"<<std::endl; }};//类显化template<>class CTest<int>{    public:    void operator()(){         using namespace  std;        std::cout<<"CTEST<int>"<<std::endl;    }};template<typename T>void printData(T  elem){    cout>>elem>>endl;}//函数显化template<>void printData(int a){    std::cout<<"this is the int method"<<std::endl;}int _tmain(int argc, _TCHAR* argv[]){    CTest<double> d;    d();    CTest<int> i;    i();    printData<int>(12);    getchar();    return 0;}
  • 关键字 typename
    作为类型前的标志符号:
template<typename T>class MyClasstypename T::SubType *ptr;

指出SubType是T中定义的一个类型,因此ptr是一个指向T::SubType的指针,如果不加typename,表达式被认为是T中的静态成员SubTyp和ptr的乘积。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 钢铁雄心4没工厂怎么办 钢铁雄心4锁区怎么办 qq超市金币满了怎么办 旋转轮胎2车翻了怎么办 轮胎里面卡进小石子应该怎么办 手游吃鸡模拟器已经到达上限怎么办 逆战场手游模拟器黑屏怎么办 欧洲卡车2翻车了怎么办 卧式注塑机锁模久了打不开怎么办 欧洲卡车2困了怎么办 欧卡2没油了怎么办 欧卡2车卡住了怎么办 欧卡2车子卡住了怎么办 做题手感变差怎么办 吃鸡游戏掉帧怎么办 买了俄区游戏怎么办 战地1子弹用完了怎么办 1kb彩信点开了怎么办 玩地球末日卡顿怎么办 电脑显示不亮了怎么办 电脑玩游戏显卡停止运行怎么办 ie浏览器打开就停止工作怎么办 蝙蝠侠阿甘骑士卡顿怎么办 捷豹钥匙没电了怎么办 车钥匙没电 汽车报警怎么办 东西卡在门锁里怎么办 锁芯里面有东西怎么办 有东西卡在锁里怎么办 锁里面卡了牙签怎么办 塑料卡在锁里怎么办 门锁被牙签堵了怎么办 锁子里面卡东西怎么办 东西卡在锁里怎么办 开车门碰到旁边车门怎么办 美团退款后 物品怎么办 倒车影像是反的怎么办 荒野行动cp版玩着玩着关机怎么办 王者荣耀点击开始游戏就闪退怎么办 电脑遥控游玩ps4画面抖动怎么办 ps4特典不能用了怎么办 苹果x出现的分屏怎么办