首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++之旅-vector

C++之旅-vector

作者头像
编程珠玑
发布2019-09-03 10:45:33
4830
发布2019-09-03 10:45:33
举报
文章被收录于专栏:编程珠玑编程珠玑

前言

标准库类型vector表示对象集合,并且所有的对象类型相同。由于它常常“容纳”其他对象,因此常称作容器。vector也是一个类模板。编译器根据模板创建类型或函数的过程称为实例化,当使用模板时,需要指出编译器应把类或函数实例化成何种类型。

初始化

与string类型一样,vector也有很多种方式进行初始化:

vector<int> v1;    //v1是一个空的vector,它包含的元素是int类型
vector<int> v2(v1);  //v2包含了v1中的副本
vector<int> v2 = v1; //等价于v2(v1)
vector<string> v3(3,"hello"); //包含3个重复string元素,每个元素的值为“hello”
vector<string> v4(8);         //包含了8个string类型的vector,执行8次初始化   
vector<char> v5{'a','b','c'};   //包含了三个char类型的元素,并都有相应的初始值
vector<T> v5={'a','b','c'};       //等价于v5{'a','b','c'}

通常情况,我们可以只提供元素数量,而不需要提供初始值,库会根据类型自动进行一个值初始化,例如:

vector<int> v6(6);   //6个元素,并且每个元素都初始化为0

以下是一些常见错误的初始化:

vector<int> a = "hello"; //错误,vector a只能存储int类型
vector<int> b = 8;     //错误,如果需要使得元素值为8,则需要使用直接初始化的方式并且指定元素个数
vector<string> c("hello"); //错误,字符串字面值不能用于构建vector的对象

特别注意,以下几种情况是有区别的:

vector<int> v1(8)    //包含8个元素,每个元素被初始化为0
vector<int> v2{8}   //包含一个函数,元素值为8
vector<int> v3(8,1)  //包含8个元素,值都为1
vector<int> v3{8,1}  //包含两个元素,值分别为8和1

vector基本操作

vector有以下基本操作:

vector<int> v;
v.push_back(10); //将10添加到v
v.push_back(8);  //将8添加到v的尾部
v.empty();      //如果v不包含任何元素,返回真
v.size()        //返回元素个数
v[1]             //返回第2个元素的引用

注意:定义一个空vector,再在运行向其中添加元素,会比创建时指定容量大小,再添加,会更加高效

解释:通常vector将元素连续存储,当添加的元素超出了原先分配的大小时,就需要重新申请空间,并把原来的元素移到新的位置。vector实现通常会比空间需求分配更大的空间,以避免在添加元素时频繁地重新分配空间并进行移动。既然如此,在一开始就设定大小,并且对其进行初始化就显得没有必要,初始化反而会影响效率,除非vector将要保存的元素都是一样的。

特别注意,不能使用下标形式添加元素,例如:

v[2] = 10;

因为添加之前,不存在下标为2的元素。下标运算符只能用于访问已经存在的元素

迭代器

所有的标准容器都可以使用迭代器。这些容器类型都拥有名为begin和end的成员,分别返回指向第一个元素和尾元素的下一个位置。 例如,可以像下面的方式使用begin和end:

#include <iostream>
#include<string>
#include<vector>
using namespace std;
int main ()
{
    /*将字符串中的字母都转换为大写*/
    string s ("hello world");
    for (auto it = s.begin (); it != s.end (); ++it)
    {
      *it = toupper (*it);
    }
    cout << s << endl;
}

声明迭代器类型it指向s.begin(),遍历每一个元素,将其转换为大写。其中++it让迭代器类型指向下一个元素,直到it指向s.end()。这里使用!=作为循环判断条件是因为很多迭代器并没有<运算符,因此并非所有的标准库类型都可以使用它。但是==和!=是所有标准库容器都定义了的。

对于迭代器之间,可以使用算数运算,例如it=it+2迭代器it的位置向前移动了两个元素,而两个迭代器相减,得到它们之间的元素间隔数。

总结

  • vector是模板而不是类型,不存在包含引用的vector,因为引用不是对象。
  • 下标运算符只能用于访问已经存在的元素。
  • 不能使用下标形式添加元素。
  • 定义一个空vector,再在运行向其中添加元素,会比创建时指定容量大小,再添加,会更加高效。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程珠玑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 初始化
  • vector基本操作
  • 迭代器
  • 总结
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档