vector的基础语法

2017-01-05 11:31:19来源:CSDN作者:fioletfly人点击

第七城市

1. vector基础介绍


需要添加头文件
  • #include<vector>
  • 添加命名空间 using std::vector

vector是什么

  • 是一个集合
  • 是一个容器
  • 就是用来存放对象的集合/容器,而且每个对象的类型是一样的
    •   比如可以存放int类型对象,就不让你不能装string类型对象

vector如何申明
  • 通过在vector后面添加尖括号,尖括号里面是要存储元素的类型,后面就是其变量名称    
    • vetctor<int> ivec
    • vector<string> svec
    • vector<class_Teacher> class_vec
    • vector<vector<string>> file

vector 可以存放什么类型的对象
  • 可以用来容纳绝大多数作为元素
  • 注意不能存放引用类型,因为引用不是对象
  • 当然vector也可以容纳vector自己对象
    • 例如:               vector<vector<int>>
    • 老版本的写法是 vector<vector<int> >最后一个尖括号,多加一个空格

vector 为什么可以存放绝大多数对象作为元素
  • 使用了类模板,简单点说,就是类中使用一种通用类型作为其数据成员类型或者成员函数
    • 具体使用的时候需要指定其类型,比如vector使用的时需要用尖括号指定其类型
  •  当一定一个vector<int> 类型的时候,
    • 编译器会根据用户指定的int类型来替换类中使用的通用类型
    • 编译器根据模板创建类或函数的过程称为实例化  

2. vector对象的定义和初始化

初始化vector对象的主要方法如下表 

默认初始化和拷贝初始化

  • 默认初始化 例如vector<string> svec;
    • svec不包含任何元素,空vector 
  • 拷贝初始化 ,直接将某个vector 复制给定义的新的vector, 注意其元素类型必须一样 
    •  vector<int> ivec;   
    •  vector<int>ivec2(ivec); 
    •  vector<int>ivec3 = ivec;
    • vector<string> svec(ivec2) ; erro, 元素的类型不一样

列表初始化

  • 用花括号括起来0个或者多个初始元素赋值为vector对象
    • vector<string> mygoal = {"To","be","number1"};
    • vector<string> mygoal {"To","be","number1"};
  • 几种初始化总结 
    •  使用拷贝初始化(=),一般只能提供一个初始值
    •  使用类内初始化 ,只能使用拷贝初始化或者花括号的形式
    •  列表初始化,只能把初始化值放在花括号里,不能放在圆括号里


值初始化

  • 对于vector而言,指定vector对象容纳元素的数量而不考虑其初始值,这叫做值初始化
    • vector<int> ivec(10);
    • vector<string>svec(10);
  • 两个特殊限制
    • 有些类要求必须提供初始值,就无法实现值初始化
      • 比如vector元素的类型不支持默认初始化时      
    • 不能使用等号=操作符,只能使用直接初始化,使用括号()操作符
      • vector<int> iv = 10   error    

创建指定数量的元素
  • 指定数量是指指定vector对象容乃的元素数量和所有元素的统一初始值
    • vector<int> ivec(10,100);   

以上三种初始化的区别

  • 本质上是理解花括号和圆括号
    • vector<int> v1(10)   
    • vector<int> v2{10}
    • vector<int> v3(10,1)
    • vector<int> v4{10,1} 
  • 理解圆括号的本质
    • 本质是利用了vector对象的构造函数来初始化
  • 花括号的本质
    • 编译器会尽可能把花括号量的值当成列表初始化来处理
    • 如果编译器无法使用列表初始化的时候,编译器会自动的将其转成()构造函数来初始化    



实例练习:
  1. 默认初始化和拷贝初始化
  2. 列表初始化实例,圆括号
  3. 值初始化的两个限制条件使用
  4. 对比三种初始化


  1. //1 默认初始化一个空的vector;
  2. vector<int> v1;
  3. // 拷贝初始化,v2中包含所有v1的元素
  4. vector<int> v2(v1);
  5. vector<int> v3 = v1;
  6. //vector<string> v4(v1); //err 注意vector只能存放相同类型的元素
  7. //2 列表初始化,使用大括号用逗号分开元素
  8. vector<string> mygoal = { "Try", "my", "best" };
  9. //vector<string> mygoal{ "Try", "my", "best" };
  10. //3 指定数量初始化
  11. vector<int> v4(10, 100); //表示vector的数量是10,初始值为100
  12. //这种情况要注意保证该元素的类型支持默认初始化,不能使用等号操作
  13. vector<int> v5(10); //表示vector的数量是10,初始值为0
  14. //vector<int> v5 = 10; //err 不能使用=操作符来赋值
  15. //4 理解圆括号和大括号的区别
  16. vector<int> v6(10); //表示vector存在这样构造函数,支持这样初始
  17. vector<int> v7(10, 1);
  18. vector<int> v8{ 10 }; //编译器首先使用表初始化来处理
  19. vector<string> v9{ 10, "hi" }; //编译器无法使用列表初始化来,会自动转换成()来处理
  20. //vector<string> v9(10, "hi");


3. vector添加元素


  • 直接初始化而不需要额外添加元素的情况
    • 初始值已知且数量少
    • 用另外的对象副本来初始化
    • 所有元素的初始化值一样

使用push_back 添加元素

  • 将元素push到vector对象的尾部
  • 使用循环来添加元素for,while
  • 尽量不要在定义vector的时候设定其大小
  • 注意点
    • 保证循环正确无误
    • for中有改变其序列大小的时候,尤其要注意



实例练习:
  1. 添加从1-99
  2. cin输入来添加vector<string> 
  3. 实例for 中改变其序列大小的情况 详见5.4.3

  1. // 1 添加 0 - 99
  2. vector<int> ivec;
  3. for (int i = 0; i < 100; i++)
  4. {
  5. ivec.push_back(i);
  6. }
  7. for (size_t i = 0; i < ivec.size(); i++)
  8. {
  9. cout << ivec[i] << endl;
  10. }
  11. //2 cin输入来添加vector<string>
  12. vector<string> svec;
  13. string tmp;
  14. while (cin>>tmp)
  15. {
  16. svec.push_back(tmp);
  17. }

第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台