《C++ Primer》读书笔记-第三章 03 标准库类型vector

来源:互联网 发布:医疗数据采集网关 编辑:程序博客网 时间:2024/04/30 14:56
作者:马志峰
链接:https://zhuanlan.zhihu.com/p/23498837
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:

  • 文中内容收集整理自《C++ Primer 中文版 (第5版)》,版权归原书所有。
  • 原书有更加详细、精彩的释义,请大家购买正版书籍进行学习。
  • 本文仅作学习交流使用,禁止任何形式的转载

学习vector的时候可以和string对比学习

  1. 定义和初始化
  2. 支持的操作
  3. 处理vector对象中的字符
    • 范围for语句
    • 下标运算符
    • 迭代器

定义和初始化

初始化vector对象的方式

vector<T> v1  vector<T> v2( v1 )  vector<T> v2 = v1  vector<T> v4( n )  vector<T> v3( n, val )  vector<T> v5{ a, b, c... }  vector<T> v5 = { a, b, c... }

详细释义见《C++ Primer》第五版(中文版) P87,表3.4

注意vector是一个模板类,在定义时需要指明vector将要容纳哪种类型的对象,编译器根据指定的类型进行实例化

vector<int> iVec;  vector<string> sVec;  vector< vector<string> > file;

对于vector的初始化,有两个情况需要注意

  1. T是int类型时,注意区分()和{}
  2. 如果使用列表初始化的形式,但列表中的值不能用来初始化vector,则会尝试用列表中的值来构造vector对象

对于第1点,严格按照表格来理解就可以了

vector<int> v1( 10 );  vector<int> v2{ 10 };  vector<int> v3( 10, 1 );  vector<int> v4{ 10, 1 );

对于第2点,

vector<string> v7{ 10 };  //v7有10个元素  vector<string> v8{ 10, "hi " };  //v8有10个“hi”

可以理解为,当 {} 不能顺利初始化的时候,会尝试替换成 () 进行初始化

支持的操作

v.empty()  v.size()  v.push_back()  v[n]  v1 = v2  v1 = { a, b, c... }  v1 == v2  v1 != v2  <, <=, >, >=

详细释义见《C++ Primer》第五版(中文版) P91,表3.5

元素的访问

  1. 范围for
  2. 下标
  3. 迭代器

和string的用法类似

同样要时刻注意下标不能越界,下标越界有可能导致程序异常

vector<int> v{ 1, 2, 3, 4 };  for( auto &i : v )  {      i *= i;  }  for( auto i : v )  {      cout << i << " ";  }  cout << endl;

上面的程序将v中的每个元素求平方并输出

作者说:

  1. vector能在运行时高效快速的添加元素。因此使用vector比较高效的一种方法就是先定义一个空的vector,再在运行时向其中添加具体值
  2. 范围for语句体内不应改变其所遍历序列的大小
  3. vector对象(以及string对象)的下标运算符可用于访问已存在的元素,而不能用于添加元素
  4. 确保下标合法的一种有效手段就是尽可能使用范围for语句

来自学习群的反馈:
刚好前几天学习群的一位码友说发现了string的奇怪现象

string s;  s[0] = 'a';  s[1] = '\0';

根据作者说的第3条,上面的程序是不合法的,但实际情况是对s[0]赋值并不会报错,运行时也未出现异常。

大家知道这个问题怎么解释吗?

0 0
原创粉丝点击