PAT乙级程序设计——知识储备(vector向量动态数组)

237 阅读3分钟

vector动态数组

vector介绍

  1. 向量vector是一种对象实体,是c++标准模板库STL(Standard Template Library)中的一种自定义的数据类型,是一种动态数组,可以广义上认为是数组的增强版。所包含的头文件为#include<vector>
  2. vector在每次插入新的元素的时候都要重新分配空间,所以时间代价比较高。vector会在分配空间的时候额外的多分配一些空间来适应可能的增长,因为存储空间比实际需要的存储空间更大。但是重新分配都是应该对数增长的间隔大小,所以在末尾做操作的时候会更加的高效。

注意:vector动态增加大小时,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此, 对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了 。

vector向量的初始化

vector<int> a ;                                //声明一个int型向量a
vector<int> a(10) ;                            //声明一个初始大小为10的向量
vector<int> a(10, 1) ;                         //声明一个初始大小为10且初始值都为1的向量
vector<int> b(a) ;                             //声明并用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+3) ;        //将a向量中从第0个到第2个(共3个)作为向量b的初始值

//用数组初始化
int n[] = {1, 2, 3, 4, 5} ;
vector<int> a(n, n+5) ;              //将数组n的前5个元素作为向量a的初值
vector<int> a(&n[1], &n[4]) ;        //将n[1] - n[4]范围内的元素作为向量a的初值

//向量嵌套向量
vector<vector<int>> v(n);

vector向量容量相关操作

向量大小: vec.size();
向量最大容量: vec.max_size();
更改向量大小: vec.resize();
向量真实大小: vec.capacity();
向量判空: vec.empty();
减少向量大小到满足元素所占存储空间的大小: vec.shrink_to_fit();

对元素的操作

多个元素赋值: vec.assign(); //类似于初始化时用数组进行赋值
末尾添加元素: vec.push_back();
末尾删除元素: vec.pop_back();
任意位置插入元素: vec.insert();
任意位置删除元素: vec.erase();
    		 vec.erase(vec.begin()+2);删除第3个元素
                 vec.erase(vec.begin()+i,vec.end()-j);删除区间[i,j-1];区间从0开始
交换两个向量的元素: vec.swap();
清空向量元素: vec.clear();

对元素的访问

      下标访问: vec[0]; //并不会检查是否越界,下标是从0开始的。
      at方法访问: vec.at(1); //以上两者的区别就是at会检查是否越界,是则抛出out of range异常
      访问第一个元素: vec.front();
      访问最后一个元素: vec.back();
      返回一个指针: int* p = vec.data(); //可行的原因在于vector在内存中就是一个连续存储的数组,所以可以返回一个指针指向这个数组。这是是C++11的特性。
	  使用迭代器访问元素:
		  vector<int>::iterator it;
		  for(it=vec.begin();it!=vec.end();it++)
		      cout<<*it<<endl;
         或者:
         for (size_t i = 0; i < vec.size(); i++) {
             cout << vec.at(i) << endl;
         }

迭代器

下标访问: vec[0]; //并不会检查是否越界,下标是从0开始的。
at方法访问: vec.at(1); //以上两者的区别就是at会检查是否越界,是则抛出out of range异常
访问第一个元素: vec.front();
访问最后一个元素: vec.back();
返回一个指针: int* p = vec.data(); //可行的原因在于vector在内存中就是一个连续存储的数组,所以可以返回一个指针指向这个数组。这是是C++11的特性。
使用迭代器访问元素:
		  vector<int>::iterator it;
		  for(it=vec.begin();it!=vec.end();it++)
		      cout<<*it<<endl;
或者:
                 for (size_t i = 0; i < vec.size(); i++) {
                     cout << vec.at(i) << endl;
                 }

算法

//(1) 使用reverse将元素翻转:需要头文件`#include<algorithm>`
reverse(vec.begin(),vec.end())`;将元素翻转(在vector中,如果一个函数中需要两个迭代器,一般后一个都不包含.)

//(2)使用sort排序:需要头文件`#include<algorithm>`
sort(vec.begin(),vec.end())`;(默认是按升序排列,即从小到大),想要从大到小,可以使用翻转函数reverse();

引用文章blog.csdn.net/ayqy42602/a…