C++ 容器与范围for 语句
#预定义
#include
using std::vector
#容器是一个模版,需要用具体的类型进行实例化
vector ivec
vector name
vector <my_class> my_own_object
可以默认初始化vector,从而创建一个指定类型的容器,只不过这时候的容器是一个空容器
看似没什么用,但是对容器进行添加元素等是很方便而且也是很常见的事情
#拷贝元素值
vector new_ivec=ivec
vector new_ivec(ivec)
#列表初始化vector对象
vector names={“xiaoming”,“xiaohong”,“xiaoqiang”}
如果提供的是列表进行容器的初始化,则必须用花括号引用起来
#创建指定数量的相等的vector
vector new_ivec(10,-1) //创建十个元素值为-1的容器
列表初始化还是元素数量?
可以用圆括号还是花括号加以区分
向vector对象中添加元素
用push_back函数
先创建一个空的vector对象,然后再利用成员函数push_back向其中添加元素
push_back负责把一个值当成vector对象的尾元素“push”到vector对象的“back”中
vector ivec;
for (int i=1;i<=100;i++)
{
ivec.push_back(i);
}
有时需要实时读入数据然后将其赋予vector对象:
string name;
vector names;
while(cin >> name)
{
names.push_back(name);
}
(开始时创建空的vector对象,在运行时再动态添加元素)
要求:如果循环体内部包括向vector对象添加元素的语句,则不能使用范围for循环
C++11提供了一种特殊的for循环:基于范围的for循环,可以简化数组的处理
(类似于py中的 for item in items)
在使用基于范围的for 循环处理数组时,该循环可以自动为数组中的每一个元素迭代一次
#不必使用计数器变量控制其迭代,也不必担心数组下标越界的问题
#基于范围的for循环的一般格式:
for (dataType rangeVariable:array)
statement;
dataType:范围变量的数据类型,或者是其能直接转化过去的数据类型
rangeVariable:范围变量的名称,在循环期间接收不同数组元素的值
array:要让该循环进行处理的数组的名称
#可以使用auto关键字指定范围变量的数据类型,而不必手动指定
使用基于范围for 循环来修改数组
在范围变量前加上引用符号&,使其变成一个引用变量,当循环执行时,该范围变量不再是数组元素的副本,而变成数组元素的别名,因此,对范围变量进行的任何修改都会实际作用到他当前引用的数组元素
如果要使用元素下标,则不能使用范围for循环
访问vector对象中元素的方法与访问string对象中字符的方法差不多,也是通过元素在vector对象中的位置。
my_vector.empty()返回容器是否为空
my_vector.size()返回容器的长度
计算vector对象内元素的索引
//以10分为一个分数段统计成绩的数量
vector scores(11,0);
unsigned grade;
while(cin >> grade)
{
if (grade<=100)
++scores[grade/10];
}
vector对象(以及string对象)的下标运算符可用于访问已存在的元素,而不能向vector中添加元素
添加元素: my_vector.push_back(item)
#试图用下标的形式去访问一个不存在的元素将引发错误,不过这种错误不会被编译器发现,而是在运行时产生一个不可预知的值(缓冲区溢出)
确保下标合法的一种有效手段:尽可能使用范围for语句