zoukankan      html  css  js  c++  java
  • STL之vector

    不知道大家之前学过模板没?就是template<typename T>使用这种方法写的函数或者类就不会受到类型的限制,比如

    template<typename T>

    T VIP_max(T a,T b)

    {

    return a>b?a:b;

    }

    template<typename T>

    class Max

    {

    public:

    Max(T a,T b)

    {

    m_a = a;

    m_b = b;

    }

    T GetMax()

    {

    return m_a>m_b?m_a:m_b;

    }

    private:

    T m_a;

    T m_b;

    };

    这样一个简单的模板类用来比较大小可以使用任意类型来调用

    这样

    Max<char> MyMax('a','z');

    char nResult = MyMax.GetMax();

    这样

    Max<int> MyMax(3,4);

    int nResult = MyMax.GetMax();

    亦或者是这样:

    Max<double> MyMax(3.14,5.26);

    double nResult = MyMax.GetMax();

    都是可以的所谓STL就是标准模板库的意思是优秀的程序员写出来的一些优良算法组成的模板 这样就能够节省许多开发成本

    那么玩完这个之后正式开始学习vector:

    vector<int> Myint;
    Myint.push_back(1);//push_back这个函数就是用来添加元素的
    Myint.push_back(2);
    Myint.push_back(3);
    Myint.push_back(3);
    Myint.pop_back();//就是删除最后一个元素
    for (size_t i=0;i<Myint.size();i++)//size()函数可以得出整个容器的大小,为了输出使用以前的C++基础很容易联想到用这种方法达到目的
    {
    cout<<Myint[i]<<" "<<endl;
    }

    但是除此之外还可以用迭代器 这是vector很具特色的一样东西

    vector <int>::(reverse_)iterator it = Myint.(r)begin(); //可逆序可正序

    for (it ;it != Myint.(r)end();it++)
    {
      cout<<*it<<endl;
    }
    cout<<endl;

    vector 的取值可以使用[]也可以使用vector.at();

    其中我觉得.at()函数调用更加好因为这里有异常捕捉

    try
    {
    Myint.at(90);
    }
    catch (const exception & error)
    {
    cerr << error.what() << endl;

    }

    //这样的话程序就不容易崩溃

    vector.front();//可以返回第一个数据

    vector.back();//可以返回最后一个数据

    //有关于赋值:
    int array[] = {0,1,2,3,4,5};
    vector<int> vecInA(array,array + 6);
    vector<int> vecInB(vecInA.begin(),vecInA.end());

     

     双向迭代器支持操作:

    it++,++it,it--.--it.*it,itA = itB,itA==itB,itA!=itB

    list set multiset map multimap支持双向迭代器

    随即访问迭代器支持:(在双向迭代器的基础上加上)

    it+=i, it-=i,it+i,it[i]

    itA<itB itA<=itB itA>=itB

    vector deque支持随机访问迭代器

     但是经过我自己写的代码检查 似乎迭代器越界不会捕捉异常


    // ++it;
    // int nTemp = *it;
    // --it;
    // nTemp = *it;
    // try
    // {
    // it+=3;
    // nTemp = *it;
    // }
    // catch (const exception & error)
    // {
    // cerr << error.what() << endl;
    //
    // }//无法捕捉到迭代器越界异常程序崩溃

    vector大小:

    .size()

    .empty()

    .resize()//很有趣 变大默认赋值0变小则直接丢弃 可以加参数则默认赋值参数

    vector插入:

    .insert(pos,elem)//pos位置插入elem元素的拷贝返回新数据的位置

    .insert(pos,n,elem)//插入n个相同元素

    .insert(pos,beg,end)//插入【beg,end】区间的数据无返回

    vector删除:

    .clear()//删除容器里所有的数据

    .erase(pos)//删除pos位置的数据返回下个数据的位置

    .erase(beg,end)//删除区间数据返回下个数据的位置

    //迭代器删除某一指定值:

    int arraya[] = {1,3,2,3,3,3,4,3,5,3};
    vector<int> vecInt(arraya,arraya + 10);
    for (vector<int>::iterator it = vecInt.begin();it != vecInt.end();)
    {
    if (3 == *it)
    {
      it = vecInt.erase(it);
    }
    else
    {
      ++it;
    }

    }

     

  • 相关阅读:
    对象方法Android之多媒体使用——MediaPlayer播放音频
    程序函数C语言中异常处理的两个函数
    退出窗口[置顶] 退出Activity的方法
    循环变量hdu 1799 循环多少次?
    网页剪辑有道云笔记、印象笔记(evernote)哪个更好?
    选项选择Windows XP系统安装MySQL5.5.28图解
    修改nullMyEclipse 设置文件的默认编码
    文件应用iOS开发用keychain替代UDID
    模块执行python模块介绍 struct 二进制数据结构
    数据库字符串AVP(AttributeValue Pair)
  • 原文地址:https://www.cnblogs.com/XCoderLiu/p/3520099.html
Copyright © 2011-2022 走看看