• 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;
    }

  • 相关阅读:
    bzoj 1176 cdq分治套树状数组
    Codeforces 669E cdq分治
    Codeforces 1101D 点分治
    Codeforces 1100E 拓扑排序
    Codeforces 1188D Make Equal DP
    Codeforces 1188A 构造
    Codeforces 1188B 式子转化
    Codeforces 1188C DP 鸽巢原理
    Codeforces 1179D 树形DP 斜率优化
    git commit -m "XX"报错 pre -commit hook failed (add --no-verify to bypass)问题
  • 原文地址:https://www.cnblogs.com/Lee-geeker/p/3432242.html
Copyright © 2020-2023  润新知