C++ Primer 学习笔记(1)

来源:互联网 发布:九九乘法java竖着 编辑:程序博客网 时间:2024/05/19 14:17

标准库 vector 类型  

vector 是同一种类型的对象的集合, 我们把vector 称为容器,是因为它可以包含其他对象。 一个容器中的所有对象都必须是同一种类型。vector 是一个类模板 (class template)。

vector<int> ivec;vector<Sales_item> Sales_vec;

和其他变量定义一样,定义vector 对象要指定类型和一个变量的列表。上面的第一个定义,类型是vector<int>,该类型即是含有若干int 类型对象的vector, 变量名是 ivec。第二个定义的变量名是Sales_vec, 它所保存的元素是 Sales_item 类型的对象。

注:vector 不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。 vector 类型是每一种都指定了其保存元素的类型。 因此, vector<int> 和 vector<string> 都 是数据类型。

//几种初始化vector对象的方式vector<T> v1;  //vector保存类型为T的对象。默认构造函数v1为空vector<T> v2(v1);  //v2是v1的一个副本vector<T> v3(n, i);  //v3包含n个值为 i 的元素vector<T> v4(n);  //v4含有值初始化的元素的n 个副本

关键概念:vector 对象动态增长

vector 对象(以及其他标准库存容器对象)的重要属性就在于可以在运行时高效地添加元素。因为vector 增长的效率高,在元素值已知的情况下,最好是动态地添加元素。


vector 对象的操作

v.empty()    //如果v为空,则返回true,否则返回falsev.size()    //返回v中元素中个数v.push_back(t)  //在v的末尾增加的一个值为t的元素v[n]       //返回v中位置为n的元素v1= v2;   //把v1的元素替换为v2中元素的副本v1 == v2;   //如果v1与v2相等,则返回true!= ,  < , <= , > , >=  //保持这些操作符惯有的含义
empty 和 size 操作类似于 string 类型的相关操作。 成员函数 size 返回相应vector 类定义的 size_type  的值。

       使用 size_type 类型时, 必须指出该类型是在哪里定义的。 vector 类型总是包括vector 的元素类型;

vector<int>::size_type  // ok       vector::size_type    // error

注:下标写法是不可以添加元素,如以下程序

vector<int> ivec;   //empty vectorfor (vector<int>::size_type ix=0; ix != 10; ++ix)       ivec[ix] = ix;   //disaster: ivec has no elements
上述程序试图在ivec中插入10个元素,元素值依次为0到9的整数。但是,这里ivec是空的vectorc对象 ,而且下标只能用于获取已存在的元素。

        这个循环的正确写法应该是:

for(vector<int>::size_type ix = 0; ix != 10; ++ix)      ivec.push_back(ix);  //ok: adds new element with value ix
必须是已存在的元素才能用下标操作符进行索引。通过下标操作进行赋值时,不会添加任何元素。

警告:对于下标操作符([ ]操作符)的使用有一点非常重要,就是仅能提取确实已存在的元素。试图获取不存在的元素必然产生运行时错误。所谓“缓冲区溢出”错误就是对不存在的元素进行下标操作的结果。这样的缺陷往往导致PC机和其他应用中最常见的安全问题。


原创粉丝点击