设为首页 加入收藏

TOP

C++中vector的使用(一)
2015-11-21 01:03:00 来源: 作者: 【 】 浏览:6
Tags:vector 使用

vector是STL中的最常见的容器,它是一种顺序容器,支持随机访问。简单的说vector就是一个能存放任意类型的动态数组,只不过数组是静态的分配空间,一旦分配了空间大小就不能在改变了,但是vector是动态分配内存,它随着元素的不断插入,会按照自身的一套机制不断扩充自己的容量。

vector的扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原油连续的内存空间后在进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器内的元素逐个复制过去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。

vector是一个类模板。使用类模板可以编写一个类型定义或函数定义,而用于多个不同的数据类型。所以vector不是一种数据类型,而是一个类模板,可以用来定义任意多种数据类型,vector类型的每一种都制定了其保存元素的类型。

当我们要使用vector的时候,我们必须在头文件中加入 #include

vector是属于std命名域的,需要通过命名限定,

using std::vector;
vector
  
    vInts;
  
或者连在一起,使用全名
 std::vector
  
    vInts;
  
也可以使用全局的命名域方式:

?

using namespace std;

?

vector的初始化

?

#include
  
   
#include
   
     using namespace std; int main() { vector
    
      vec1; //创建一个空的vector vector
     
       vec2(vec1); //复制vec1 vector
      
        vec3(10); //创建一个vector,含有n个数据,数据均以缺省构造产生 vector
       
         vec4(10, 1);//创建一个含有10个1的vector }
       
      
     
    
   
  

vector的操作

    vec.assign(beg,end);
    vec.assign(n,elem);
     // 将[beg; end)区间中的数据赋值给c。将n个elem的拷贝赋值给c。
    vec.at(idx) // 传回索引idx所指的数据,如果idx越界,抛出out_of_range。
    vec.back()      // 传回最后一个数据,不检查这个数据是否存在。
    vec.begin()     // 传回迭代器中的第一个数据地址。
    vec.capacity()  // 返回容器当前已分配的容量。
    vec.clear()     // 移除容器中所有数据。
    vec.empty()     // 判断容器是否为空。
    vec.end()       // 指向迭代器中末端元素的下一个,指向一个不存在元素。
    vec.erase(pos)  // 删除pos位置的数据,传回下一个数据的位置。
    vec.erase(beg,end)  //删除[beg,end)区间的数据,传回下一个数据的位置。
    vec.front()     // 传回第一个数据。
    get_allocator // 使用构造函数返回一个拷贝。
    vec.insert(pos,elem)    // 在pos位置插入一个elem拷贝,传回新数据位置。
    vec.insert(pos,n,elem)  // 在pos位置插入n个elem数据。无返回值。
    vec.insert(pos,beg,end) // 在pos位置插入在[beg,end)区间的数据。无返回值。  
    vec.max_size()       // 返回容器中最大数据的数量。
    vec.pop_back()       // 删除最后一个数据。
    vec.push_back(elem)  // 在尾部加入一个数据。
    vec.rbegin()         // 传回一个逆向队列的第一个数据。
    vec.rend()           // 传回一个逆向队列的最后一个数据的下一个位置。
    vec.resize(num)      // 重新指定队列的长度。
    vec.reserve()        // 保留适当的容量。
    vec.size()           // 返回容器中实际数据的个数。
    vec1.swap(vec2)
    swap(vec1,vec2)        // 将c1和c2元素互换。同上操作。
下面是部分成员函数的操作

?

#include 
  
   
#include 
   
     //必须包含头文件 using namespace std; int main() { //几种vector声明 vector
    
     v1; //定义空的vector vector
     
      v2(10); //产生大小为10的vector vector
      
       v3(10,-1); //产生大小为10,并且每个元素都是-1的vector vector
       
        v4(v3); //用一个vector产生一个vecotr int arr[5]={1,2,3,4,5}; vector
        
         v5(arr,&arr[5]); //以区间[beg;end)做为初值的vector cout<<"当前元素数量"<
         
          ::iterator ita; //声明一个迭代器 int i=0; for(ita=v1.begin(), i=0;ita != v1.end();i++,ita++)//v1.begin()指向v1的第一个元素,v1.end()指向最后元素的下一位置 { cout<<"v1中的"<
          
           ::reverse_iterator ita; v2=v1; //将v1的元素全部拷到v2 for(ita=v2.begin(),i=0;ita != v2.end();i++,ita++) { cout<<"v2中的"<
           
            ::iterator pos=v1.begin(); v1.insert(pos,11); //v1.insert(pos,4,55); //如果直接用就是错的,因为迭代器失效了 //v1.insert(pos,arr,&arr[5]); for(ita=v1.begin(),i=0;ita != v1.end();i++,ita++) { cout<<"v1中的"<
            
             

以下内容来源于他人

?

内存管理与效率

1》使用reserve()函数提前设定容量大小,避免多次容量扩充操作导致效率低下。

关于STL容器,最令人称赞的特性之一就是是只要不超过它们的最大大小,它们就可以自动增长到足以容纳你放进去的数据。(要知道这个最大值,只要调用名叫max_size的成员函数。)对于vector和string,如果需要更多空间,就以类似realloc的思想来增长大小。vector容器支持随机访问,因此为了提高效率,它内部使用动态数组的方式实现的。在通过 reserve() 来申请特定大小的时候总是按指数边界来增大其内部缓冲区。当进行insert或push_back等增加元素的操作时,如果此时动态数组的内存不够用,就要动态的重新分配当前大小的1.5~2倍的新内存区,再把原数组的内容复制过去。所以,在一般情况下,其访问速度同一般数组,只有在重新分配发生时,其性能才会下降。正如上面的代码告诉你的那样。而进行pop_back操作时,capacity并不会因为vector容器里的元素减少而有所下降,还会维持操作之前的大小。对于vector容器来说,如果有大量的数据需要进行push_back,应当使用reserve()函数提前设定其容量大小,否则会出现许多次容量扩充操作,导致效率低下。

reserve成员函数允许你最小化必须进行的重新分配的次数,因而可以避免真分配的开

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇BZOJ 4027 HEOI2015 兔子与樱花 .. 下一篇poj3414 Pots

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: