STL——vector

。。。。。。。。。。。。。。。

函数

  • int len = vec.size();
  • vec.push_back(temp);
  • vector::pop_back(); //删除最后一个元素
  • 初始化vector:
    1
    2
    3
    4
    5
    vector<int>vec;   //初始化为空
    vector<int>vec(v1); //用另一个vector来初始化,即构造一个副本
    vector<int>vec(n, i); //大小为n,并全部初始化为元素i (常用)
    vector<int>(n); //构造大小为n的容器,没有初始化里面的元素
    vector<int>{1,2,3,4}; //构造大小为4,并初始化里面的各个元素
  • 遍历容器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //迭代器
    vector<int>::iterator it;
    for(it=vec.begin();it!=vec.end();it++){
    *it=0;
    }

    //下标
    for(int i=0;i<vec.size();i++){
    vec[i]=0;
    }
  • 插入: vec.insert(vec.begin()+i,a); //在第i个元素后面插入a;

  • 删除: vec.erase(vec.begin()+2); //删除第3个元素

      vec.erase(vec.begin()+i,vec.end()+j);    //删除区间[i,j-1];区间从0开始
    
    1
    2
    3
    4
    for(int i=0;i<vec.size();i++){
    vec.erase(vec.begin()+i);
    i--; //注意这里一定要i--
    }
  • 清空:vec.clear() //清空之后,vec.size()为0

  • 判空:vec.empty(); //判断是否为空,为空返回true,否则返回false;
  • vec.resize(n+m); //调整vec的大小变为n+m
  • vec.capacity(); //获取容器分配的存储空间,区别于vec,size()
  • sort(vec.begin(),vec.end());
  • reverse(vec.begin(), vec.end()); //反转
  • swap(vec[i],vec[j]);

存储方式

与其他容器不同,其内存空间只会增长,不会减小。先来看看”C++ Primer”中怎么说:为了支持快速的随机访
问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,
为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对
vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些。就是说,vector容器预留了一些额外的存储
区,用于存放新添加的元素,这样就不必为每个新元素重新分配整个容器的内存空间。
关于vector的内存空间,有两个函数需要注意:size()成员指当前拥有的元素个数;capacity()成员指当前(容器必须分
配新存储空间之前)可以存储的元素个数。reserve()成员可以用来控制容器的预留空间。vector另外一个特性在于它的
内存空间会自增长,每当vector容器不得不分配新的存储空间时,会以加倍当前容量的分配策略实现重新分配。例如,
当前capacity为50,当添加第51个元素时,预留空间不够用了,vector容器会重新分配大小为100的内存空间,作为新
连续存储的位置。

内存释放

由于vector的内存占用空间只增不减,比如你首先分配了10,000个字节,然后erase掉后面9,999个,留下一个有效元素,但是内存占
用仍为10,000个。所有内存空间是在vector析构时候才能被系统回收。empty()用来检测容器是否为空的,clear()可以清空所有元素。
但是即使clear(),vector所占用的内存空间依然如故,无法保证内存的回收,所以我们要用swap()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);

cout << "size:" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl;

vector<int>().swap(v);
cout << "after swap size:" << v.size() << endl;
cout << "after swap capacity:" << v.capacity() << endl;
return 0;
}
/*输出:
size:5
capacity:6
after swap size:0
after swap capacity:0*/

或者shrink_to_fit();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);

cout << "size:" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl;

v.clear();
v.shrink_to_fit();
cout << "after swap size:" << v.size() << endl;
cout << "after swap capacity:" << v.capacity() << endl;
return 0;
}
/*输出:
size:5
capacity:6
after swap size:0
after swap capacity:0*/

Donate comment here