STL Vector容器用法

Vector向量        ---连续存储元素的数组

      ——以类模板形式封装的数据结构,用于储存数据。    头文件#include<vector>

      vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。

      vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据

      vector行为完全是一个数组,它的内存空间是连续的,只不过这个数组的大小是可变的。(vector在初始化时会申请一定的空间来存储数据,一旦所申请的空间不够用的时候,它会在另一个地方开辟一块是原空间两倍的内存空间,再将原空间的元素全部复制到新的空间。所以内存空间是连续的)

      所有的STL容器都属于标准命名空间,因此使用容器时必须包含语句:using namespace std;

1. vector的初始化

vector<int>iv;           //创建一个空的vector,iv相当于一个数组
  //vector<int>iv;
  //iv[0]=1;             //×,vector的空间还没有被分配
vector<int>iv(n);        //创建一个含有n个元素的vector
  //vector<int> ivec(10, -1);        // 10个int类型的元素,每个都被初始化为-1
  //vector<string> svec(10, "hi");   // 10个string类型的元素,每个都被初时化为”hi”
  //vector<int> ivec(10);            // 10个元素,每个都初始化为0 
  //vector<string> svec(10);         // 10个元素,每个都是空string对象
v[0] = 1;                 //在已有空间内可以任意赋值
vector<int>iv(n,elem);    //创建一个含有n个元素的vector,每个元素都是elem
vector<int>iv2(iv1);      //创建一个新的vecor,并将iv1的元素全部复制到iv2

      在C++11标准中出现了下面两种新的初始化方式:

vector<int>v={ 1, 2, 3, 4 ,5};    // v中每个元素被赋了相应的值
vector<char>w = {'a','s','d','f' }; 
vector<char>w = { "asdf" };       //×
vector<string>x = { "a", "ab","abc", "abcd" }
  //vector<int> v1(10);           // v1有10个元素,每个的值都是0 
  //vector<int> v2{10};           // v2有1个元素,该元素的值是10 
  //vector<int> v3(10, 1);        // v3有10个元素,每个的值都是1
  //vector<string> v6("hi");      // ×,不能使用字符串字面值构建vector对象 
  //vector<string> v8{10, "hi"};  // v8有10个值为"hi"的元素

     由于目前完全支持C++11标准的编译器不多,当要对vector赋予不同初值的时候,我们就需要借助数组的形式来给vector赋予初值

int arr[]={0,1,2,3,4,5};                      //整型
vector< int > ivec(arr,arr+6);
int cnt = sizeof(arr1) / sizeof(int);
vector< int > ivec1(arr1, arr1 + cnt);        //vector< int > ivec (begin(arr), end(arr));
string arr3[] = { "a", "ab", "abc", "abcd" }; //string类型
vector< string > ivec3(begin(arr3), end(arr3));

2. vector遍历(一般使用迭代器)

迭代器访问元素遍历:
vector<int>::iterator it;                 //[ɪtə'reɪtə]迭代器
for(it=vec.begin();it!=vec.end();it++)    //vec.begin()=begin(vec)
cout<<*it<<endl;
它还可以像数组一样去遍历:
for (int i = 0; i !=vec.size(); i++)                                
cout <<vec[i] << endl;

3. 成员函数:

v.push_back(a);           //在数组末尾插入数字a,v的大小+1
v.pop_back()              //删除最后一个数据,v的大小-1
v.front()                 //返回第一个元素
v.back()                  //返回最后一个元素
v.size();                 //容器中实际数据个数
v.capacity();             //容器中可存放元素的个数
v[i];                     //使用下标访问元素
v.at(i);                  //等价于v[i],但进行了下标检查,越界抛出out_of_range异常
v.begin()=begin(v)        //返回指向容器第一个元素的迭代器
v.end()=end(v)            //返回指向容器最后一个元素的下一个位置的迭代器迭代器的范围[begain,end)
v.clear()                 //清空容器中所有数据,v的大小变为0
v.empty()                 //如果容器v为空,返回真   [ˈempti]空的
v.resize(num)             //重新设置容器大小,多删少补0   [ˌri:ˈsaɪz]调整大小
v.erase(pos)              //删除迭代器p所指向的元素,返回指向下一个字符的迭代器
v.erase(begin,end)        //删除迭代器[b,e)所标记的范围内的元素,返回指向被删除的最后一个字符的下一个位置的迭代器,end指向要删元素的下一位地址) 
v.insert(pos,elem)        //在迭代器p所指的位置插入元素e(插在p位置的前面)
v.insert(pos,n,elem)      //在迭代器p所指的位置插入n个元素(插在p位置的前面)
swap(c1,c2)               // 将c1和c2对象互换
v.assign(beg,end)         //将[beg,end)一个左闭右开区间的数据赋值给c
v.assign (n,elem)         //将n个elem的拷贝赋值给c   [əˈsaɪn] 分派,选派,分配

4. 排序

    sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).

    可以通过重写排序比较函数按照降序比较,如下:
    bool Cmp(const int &a,const int &b){  
      return a>b;
    }
    调用时:sort(vec.begin(),vec.end(),Cmp),这样就降序排序。

5. 扎心的STL

vector的删除操作用如下方法(避免野指针):it=v.erase(it);  因为v.erase(it)后,it指向不明,变为了野指针,再使用it报错!   
错误代码:
vector<int>::iterator it = v.begin();
while (it!=v.end()){
    if (*it==1){
       v.erase(it); //当执行v.erase(it)后,迭代器it指向不确定,变成了野指针!
     }
    else itr++;     //iter的状态是不确定的,再进行++,岂有不崩溃的道理!!
}
正确代码:
vector<int>::iterator it = v.begin();
   while (it!=v.end()){
    if (*it==1){
        it=v.erase(it); //itr指向下一个元素
     }
    else  itr++;
}

很多人还用到过remove,但是对于很多人不能分清楚remove和erase的区别?

// STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase()。
// vector中的remove是将等于value的元素放到vector的尾部,但并不减少vector的size。
// vector中erase是删除掉某个位置position或一段区域(begin,end)中的元素,减少其size。  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值