zoukankan      html  css  js  c++  java
  • STL_Vector

    /***************************************
    *Vector总结
    *vector模塑出一个动态数组,因此,它本身是“将元素至于动态数组中加以管理”
    *的一个抽象的概念。
    *
    *1.使用前需要包含头文件<vector>
    *2.Vector将其元素复制到内部的dynamic array中。
       元素之间总是存在某种顺序,所以vector是一种有序群集(ordered collec)。 
       vector支持随机存取,因此只要知道位置,你可以在常数时间内存取任何一个元素。
       vector的迭代器是随机存取迭代器,所以对任何一个STL算法都可以奏效。
    
    *个人理解:vector是在末端插入 或者 删除元素,可以说相当于一个栈吧。
    
    *vector中用于操作大小的函数
    
      size();
      empty();
      max_size();
      capacity();(返回vector实际能容纳的元素数量,如果超过这个数量,vector就有必要重新配置内部存储器)
      
    
      A.一旦内存重新配置,和vector元素相关的所有reference、pointers、iterators都会失效
      B.内存重新配置很耗时间
    
      所以如果你的程序管理了和vector元素相关的reference、pointers、iterators,
      或者如果执行速度对你而言至关重要,那么就必须考虑容量问题。
    
    *避免重新配置内存的方法
    
      可以用 reserve()保留适当的容量
    
      std::vector<int> v;
      v.reserve(80);
      另一种避免重新配置内存的方法是,初始化期间就向构造函数传递附加参数,构造出足够的空间,
      如果是ACM的话,一般是这样用的。
      std::vector<T> v(5);
    
      vector不能使用reserve()来所见容量,这一点于string不同。
    
    
    *构造,拷贝和解构
    
      vector<Elem> c            产生一个空vector,其中没有任何元素
      vector<Elem> c1(c2)        产生另一个同型vector的副本(所有元素都被拷贝)
      vector<Elem> c(n)            利用元素的default构造函数生成一个大小为n的vector
      vector<Elem> c(n,elem)    产生一个大小为n的vector,每个元素值都是elem
      vector<Elem> c(beg,end)    产生一个vector,以区间[beg;end]作为元素初值
      c.~vector<Elem>()            销毁所有元素,并释放内存
    
    *非变动性操作(Nonmodifying Operation)
    
      c.size();
      c.empty()
      c,max_size();
      capacity();
      reserve();    //并非完全意义上的非变动
    
      c1 == c2;
      c1 != c2
      c1 < c2;
      c1 > c2;
      c1 <= c2;
      c1 >= c2;
    
    
    *赋值(Assignments)
    
      c1 = c2                    将c2的全部元素赋值给c1
      c.assign(n,elem)            复制n个elem,赋值给c
      c.assign(beg,end)
      c1.swap(c2)
      swap(c1,c2)
    
    *元素存取(Element Access)
    
      c.at(idx)                    返回索引idx所标识的元素。如果idx越界抛出out_of_range
      c[idx]                    返回索引idx所表示的元素,不进行范围检查
      //个人觉得就是把vector当作一个数组来用了
      c.front()                    返回第一个元素,不检查第一个元素是否存在
      c.back()                    返回最后一个元素,不检查最后一个元素是否存在
    
      //对于调用者来说,最重要的事情莫过于搞清楚这些操作是否进行范围检查。
      //只有at()会这么做
      //对一个vector调用operation[],front(),back(),都会引发未定义行为。
    
    *迭代器相关函数(Iterator Function)
    
      vector提供了一些常规函数来获取迭代器。(通常就是一个指针)
    
      c.begin();                返回一个随机存取迭代器,指向第一个元素
      c.end();                    返回一个随机存储迭代器,指向最后一个元素的一下个位置
      c.rbegin();                返回一个逆向迭代器,指向逆向迭代的第一个元素
      c.rend();
    
    *安插(insert) 和 移除(remove)元素
    
      c.insert(pos,elem)        在pos位置上插入一个elem副本,并返回元素位置
      c.insert(pos,n,elem)        在pos位置上插入n个elem副本。无回传值
      c.insert(pos,beg,end)        在pos位置上插入区间[beg;end]内的所有元素的副本,无回传值
      
      c.push_back(elem)            在尾部添加一个elem副本
      c.pop_back()                移除最后一个元素(但不回传)
      c.erase(pos)                移除pos位置上的元素,返回下一个元素的位置    
      c.erase(beg,end)
    
      c.resize(num)                将元素数量改为num(如果size()变大了,多出来的新元素都以default构造函数来完成)
      c.resize(num,elem)        
    
      c.clear()                    移除所有元素,将容器清空
    
    
    *将Vector当作一般Arrays使用
    
    
      std::vector<char> v;
      v.resize(41);
      strcpy(&v[0],"hello, world!");
      printf("%s
    ",&v[0]);
    
    
      //千万不要把迭代器当作第一元素的地址来传递。vector迭代器是由实作版本定义的,也许并不是一个一般指针
      //当然一般情况下是。。。
    
      printf("%s
    ",&v[0]);//OK
      printf("%s
    ",v.begin());//ERROR
    
    
    
    *异常处理(Exception Handling)
    
    
    
    ****************************************************************/
    
    
    /*********************************
            Vector实例
    *********************************/
    #include <iostream>
    #include <vector>
    #include <iterator>
    using namespace std;
    
    
    
    
    void Print_Element(vector <string> Object);
    
    vector<string>::iterator Find(vector<string>::iterator Begin,vector<string>::iterator End,char* szTemp);
    
    void main()
    {
        vector <string> Object;
    
        Object.reserve(5);
    
        Object.push_back("Hello, ");
        Object.push_back("How");
        Object.push_back("are");
        Object.push_back("you");
        Object.push_back("?");
    
    
    
    //     copy(Object.begin(),Object.end,
    //         ostream_iterator<string>(cout," "));
        Print_Element(Object);
    
    
        cout<<Object.max_size()<<endl;
    
        cout<<Object.size()<<endl;
        cout<<Object.capacity()<<endl;
    
    
        swap(Object[1],Object[3]);
    
    
    
        //Print_Element(Object);
    
    
    //    Object.insert(find(Object.begin(),Object.end(),"?"),"always");
    
    
        if (Find(Object.begin(),Object.end(),"?")!=NULL)   
            //如果查找成功 我返回一个迭代器 否则返回NULL
        {
            Object.insert(Find(Object.begin(),Object.end(),"?"),"always");
        }
    
    //    Object.insert(Find(Object.begin(),Object.end(),"?")!=NULL,"always");
    
    
        
        Print_Element(Object);
    
        Object.back() = "!";  //更改最后一个string
        Print_Element(Object);
    
    
        Object.front() = "xxx";
    
        Print_Element(Object);
    
    
        cout<<Object.max_size()<<endl;
        
        cout<<Object.size()<<endl;
        cout<<Object.capacity()<<endl;
        //容量不足时,扩充一倍
        
    
    
    }
    
    vector<string>::iterator 
    Find(vector<string>::iterator Begin,vector<string>::iterator End,char* szTemp)
    {
    
        vector<string>::iterator pos;
    
        pos = Begin;
    
        for (pos;pos!=End;pos++)
        {
            if (pos->compare(szTemp)==0)
            {
                return pos;
            }
        }
    
    
        return NULL;
    
    
    }
    
    
    void Print_Element(vector <string> Object)
    {
        vector <string>::iterator it;
    
        it = Object.begin();
        for (;it!=Object.end();it++)
        {
        //    cout<<*it<<endl;
    
    
            cout<<it->data()<<" ";
        }
    
        cout<<endl;
    }
    /***********************************************************************
            实例2
    ***********************************************************************/
    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    void Print_Element(vector<int> Object);
    
    int main()
    {
    
        int i = 0;
        vector <int> Object(5,2);
    
        cout<<"Object.size(): "<<Object.size()<<endl;
    
        cout<<"Object.capacity(): "<<Object.capacity()<<endl;
    
        cout<<"Object.max_size(): "<<Object.max_size()<<endl;
    
        Object.reserve(10);
    
        cout<<"After reserve(10)"<<endl<<endl;
        cout<<"Object.size(): "<<Object.size()<<endl;
    
        cout<<"Object.capacity(): "<<Object.capacity()<<endl;
    
        cout<<"Push Data:"<<endl;
        for(i=0;i<5;i++)
        {
            Object.push_back(i);
        }
    
        Print_Element(Object);
        cout<<"Object.size(): "<<Object.size()<<endl;
    
        cout<<"Object.capacity(): "<<Object.capacity()<<endl<<endl;
    
        swap(Object[0],Object[8]);
    
        cout<<"After swap(Object[0],Object[8]) :"<<endl;
        
        Print_Element(Object);
    
        for(i=0;i<5;i++)
        {
            Object.pop_back();
        }
    
        cout<<"After Pop Data :"<<endl<<endl;
        Print_Element(Object);
    
    
        int front = Object.front();
        int back = Object.back();
        cout<<"front:"<<front<<endl;
        cout<<"back:"<<back<<endl<<endl;
    
        cout<<"After Object.assign(3,10): "<<endl;
        Object.assign(3,10);
        Print_Element(Object);
    
    
        vector <int> One(Object);
        cout<<endl<<"After vector <int> One(Object): "<<endl;
    
        Print_Element(One);
    
        cout<<endl<<"cout<<Object[0]: "<<ends<<Object[0]<<endl<<endl;
    
        Object.resize(10,100);
    
        cout<<"After Object.resize(10,100): "<<endl;
        Print_Element(Object);
    
     
    
        vector <int>::iterator pos;
        pos = Object.begin();
    
        cout<<"After Object.insert(pos,99): "<<endl;
        Object.insert(pos,99);
        Print_Element(Object);
        
        cout<<endl<<"Object.size(): "<<Object.size()<<endl;
    
        cout<<"Object.capacity(): "<<Object.capacity()<<endl;
    
    
        //这里由于插入了一个新的元素,所以vector的容量不够用了,
        //进而导致了vector重新配置内存,
        //所以iterator失效了,不加上下面的    pos = Object.begin(),程序会奔溃的
        //
    
        pos = Object.begin();        //必须有这句,相当于手动重置pos
    
        Object.erase(pos);
        cout<<endl<<"After Object.erase(pos): "<<endl;
        Print_Element(Object);
    
    
    
    
    
        return 0;
    }
    
    
    
    void Print_Element(vector<int> Object)
    {
        vector<int>::iterator it;
    
        it = Object.begin();
    
        for(;it<Object.end();it++)
        {
            cout<<*it<<ends;
        }
        cout<<endl;
    }

  • 相关阅读:
    sql-定义变量
    sql-逻辑循环while if
    iOS生命周期
    iOS系统架构
    SVN记住密码
    视图在控制权限的作用
    20140524数据库课笔记
    char和varchar区别
    多表查找
    create table约束
  • 原文地址:https://www.cnblogs.com/Lee-geeker/p/3432242.html
Copyright © 2011-2022 走看看