对接CSP-J/S认证C++算法蓝桥等考导学/四级:线性数据结构/之三:(16)向量


一、观看PPT教程 

01】STL介绍02】STL向量

二、练习题(不清楚回头查看有关PPT)

01】下面是STL的介绍,如果有错误请改正:

STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是C++提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。从根本上说,STL 是一些容器、算法和其他一些组件的集合。注意,这里提到的容器,本质上就是封装有数据结构的模板类,例如 list、vector、stack 等,有关这些容器的具体用法,后续章节会做详细介绍。在各种容器中,最常做的操作无疑是遍历容器中存储的元素,而实现此操作,多数情况会选用“迭代器(iterator)”来实现。那么,迭代器到底是什么呢?简单来讲,迭代器和 C++的指针非常类似,它可以是需要的任意类型,通过迭代器可以指向容器中的某个元素,如果需要,还可以对该元素进行读/写操作。注意:容器适配器 stack 和 queue 没有迭代器,它们包含有一些成员函数,可以用来对元素进行访问。【02】下面是向量的定义,如果有错误请改正:向量(vector)是c++标准库提供的一个可变长数组类型,属于容器,它可以像数组一样进行数据的存储和访问。vector 会根据需要自动扩展其自身的容量来容纳更多的数据。普通数组在定义初始大小后,其容量不可变;向量在定义初始大小后,仍可根据需要扩充容量。03】向量声明格式是“vector<数据类型> 向量名称”,请说出下面向量的声明方法的意义:①vector<数据类型> v;②vector<数据类型> v(n);③vector<数据类型> v(n, x);④vector< vector<数据类型> > v;注:声明二维向量时最外的<>要有空格,否则在较旧的编译器下可能报错。
04】下面是向量vector的功能测试程序,请补全缺失的注释:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#include<iostream>#include<vector>   //using namespace std;vector<int> v;  ////begin()返回指向容器中第一个元素的迭代器void testBegin(){  vector<int>::iterator it = v.begin();  cout << *it << endl;} //void testEnd(){  vector<int>::iterator it = v.end();  cout << *it << endl;}//void testRbegin(){  vector<int>::reverse_iterator it = v.rbegin();  cout << *it << endl;} //void testRend(){  vector<int>::reverse_iterator it = v.rend();  cout << *it << endl;} //void testSize() {  cout << "size=" << v.size() << endl;}//遍历void print_vector(){  vector<int>::iterator it;  //从左到右遍历   for(it = v.begin(); it != v.end(); it++){    cout << *it << "  ";  }  cout << " | ";  vector<int>::reverse_iterator rit;  //   for(rit = v.rbegin(); rit != v.rend(); rit++){    cout << *rit << "  ";  }  cout << endl;} //通过size()遍历void print_vector_by_size(){  //从左到右遍历   for(int i = 0; i < v.size(); i++){    cout << v[i] << "  ";  }  cout << " | ";  //   for(int i = v.size()-1; i >= 0; i--){    cout << v[i] << "  ";  }  cout << endl;}/* 利用C++11遍历 */void print_vector_by_cpp11(){  //从左到右遍历   for(int x : v){    cout << x << "  ";  }  cout << endl;}//void testFront(){  vector<int>::reference ref = v.front();  //  print_vector();  ref = 3;  //  print_vector();}//void testBack(){  vector<int>::reference ref = v.back();  print_vector();  ref = 10;  //  print_vector();}//void testPush_back(){  v.push_back(200);  //  print_vector();}//void testPop_back(){  v.pop_back();  print_vector();}//void testEmplace() {  v.emplace(++v.begin(), 200);  print_vector();}//void testEmplace_back() {  v.emplace_back(400);  print_vector();}//void testEmpty(){   cout << "empty="  << v.empty() << endl;} //void testInsert(){  v.insert(v.begin(), 20);  //  print_vector();  v.insert(v.begin() + 5, 20);  //  print_vector();  v.insert(++v.begin(), 3, 121);  //  print_vector();  //建立一个新向量   int dt[] = {8,11,25,29,23};  vector<int> v2;  for(int i = 0; i < 5; i++)v2.push_back(dt[i]);  //  v.insert(v.end(), v2.begin(), v2.end());  print_vector();}//void testErase(){  v.erase(v.begin());  //  print_vector();  v.erase(++v.begin());  //删除第二个元素   print_vector();  //删除第二个到倒数第二个(包括) 元素  v.erase(++v.begin(), --v.end());     print_vector();  v.erase(v.begin(), v.end()); //  print_vector();}//void testClear(){  v.clear();  print_vector();}//void testSwap(){  vector<int> v2;  for(int i = 1; i < 11; i++)v2.push_back(i*i);  v.swap(v2);  print_vector();}
//初始化向量 void init(){  int data[] = {5,1,1,3,3,1,8,13,50};  for(int i = 0; i < 9; i++)v.push_back(data[i]);} int main(){    init();    testSize();     print_vector_by_size();    print_vector_by_cpp11();    testBegin();    testEnd();    testRbegin();    testRend();    testFront();    testBack();    testPush_back();    testPop_back();    testEmplace();    testEmplace_back();    testInsert();    testErase();    testSwap();    testClear();    testEmpty();  return 0;}

05】编程题:二维数组的存储
06】编程题:移动0