1.vector(向量)概述
标准库类型vector表示对象的集合,是一个类模板。vector容纳了一些对象,所以也常称之为容器,其中所有对象的类型都相同。这个集合中的每个对象都有一个与之对应的索引,用于访问指定的对象。编译器根据模板创建类或函数的过程称为实例化。因为引用不是对象,所以不存在包含引用的vector,除此之外的大部分内置类型和类类型都可以构成vector对象,甚至vector的元素也可以是vector。
2.定义和初始化vector对象
#include <vector>
#include <string>
#include <iostream>
using namespace::std;
int main()
{
//默认初始化,svec不含任何元素
vector<string> svec;
//也可以指定元素初始值
vector<int> ivec;
ivec[0] = 520;
vector<int> ivec2 = ivec;//把ivec的元素拷贝给ivec2
vector<int> ivec3(ivec2);//另一种写法
//列表初始化vector对象
//下面的vector对象包含三个元素,即三个字符串
vector<string> articles = { "a", "bonny", "girl" };
//创建指定数量的元素
vector<int> ivec4(99, 20);//99个int类型的元素,每个都是20
vector<string> svec2(13, "hug");//13个string类型的元素,每个都是"hug"
//值初始化
//初始化我们可以只提供元素数量,这是库会创建一个值初始化的元素初值,并把它赋给容器中的所有元素
//这个初值由元素类型决定,不支持默认初始化的类不能这样初始化
vector<int> ivec(10);//10个元素每个都被初始化为0
vector<string> svec(10);//10个元素都被初始化为空string对象
//注意区分花括号{}(列表初始化对象)和圆括号()(构造对象)的使用
//当使用了花括号但是提供的值不能用来列表初始化时,会进行构造
vector<int> v1(10);//10个0
vector<int> v2{ 10 };//1个10
vector<int> v3(10, 1);//10个1
vector<int> v4{ 10,1 };//1个10,1个1
//练习3.12下列vector对象的定义正不正确,正确的描述执行结果,不正确的说明原因
vector<vector<int>> ivec;//正确,定义ivec中的元素类型是vector<int>
vector<string> svec = ivec;//不正确,ivec的元素是int不是string对象
vector<string> svec(10, "null");//正确,10个"null"
//练习3.13下列vector对象各包含多少元素,这些元素的值分别是多少
vector<int> v1;//0个元素
vector<int> v2(10);//10个0
vector<int> v3(10, 42);//10个42
vector<int> v4{ 10 };//1个10
vector<int> v5{ 10,42 };//1个10,1个42
vector<string> v6{ 10 };//10个空string对象
vector<string> v7{ 10,"hi" };//10个"string"
}
3.向vector对象中添加元素
#include <iostream>
#include <string>
#include <vector>
using namespace::std;
int main()
{
//push_back是vector的成员函数,负责把一个值当成vector对象的尾元素push(压)到vector对象的back(尾端)
vector<int> v2;
for (int i = 0; i != 100; ++i)
{
v2.push_back(i);//一次把整数值放到v2的尾端
cout << v2[i];
}
//循环结束后v2中有100个元素,值从0到99
//从标准输入中读取Word并作为vector对象的元素存储
string word;
vector<string> text;
while (cin >> word) {
text.push_back(word);
}
//高效使用vector的方法是先定义是个空的vector对象,再在运行时添加具体值
//首先明确,循环体内部包含向vector对象元素的语句不能使用范围for循环
//练习3.14 使用cin读取一组整数并将它们存入一个vector对象
vector<int> iv;
int i;
while (cin >> i) {
iv.push_back(i);
}
//练习3.15 改写上面的程序,使读入字符串
vector<string> sv;
string s;
while (cin >> s) {
sv.push_back(s);
}
}
4.其他vector操作及练习
#include <string>
#include <iostream>
#include <vector>
#include <cctype>
using namespace::std;
//除了push_back之外,还有下面一些vector提供的重要操作,和string的一些操作类似
int main()
{
//将v中的每个元素平方,然后输出
vector<int> v{ 1,2,3,4,5,6,7,8,9 };
for (auto &i : v)
i *= i;
for (auto &i : v)
cout << i << endl;
//v.empty()
//v.size() 对于vector<int> v,它的返回值类型是vector<int>::size_type
//< > <= >= 和string中类似,当然,只有vector中的元素的值可以比较时才能使用
//计算vector内对象的索引
//统计分数段的例子
vector<unsigned> scores(11, 0);
unsigned grade;
while (cin >> grade) {
if (grade <= 100)//这里确认输入是否合理十分重要
++scores[grade / 10];//笔者觉得这很精妙简洁
}
for (auto c : scores)
cout << c << " ";
//不能用下标形式添加元素(可以访问元素)
vector<int> ivec;
for (decltype(ivec.size()) ix = 0; ix != 10; ++ix)
ivec[ix] = ix;//严重错误,ivec不包含任何元素,自然不能通过下标去访问任何元素
//正确的办法是使用push_back
//只能对确定存在的元素执行下标操作
//使用范围for语句是确保下标合法的好方法
//练习3.16 把下面vector对象的容量和具体内容输出出来
vector<int> v1;//0个元素
vector<int> v2(10);//10个0
vector<int> v3(10, 42);//10个42
vector<int> v4{ 10 };//1个10
vector<int> v5{ 10,42 };//1个10,1个42
vector<string> v6{ 10 };//10个空string对象
vector<string> v7{ 10,"hi" };//10个"string"
cout << v1.size() << endl;
cout << v2.size() << endl;
cout << v3.size() << endl;
cout << v4.size() << endl;
cout << v5.size() << endl;
cout << v6.size() << endl;
cout << v7.size() << endl;
for (auto i : v1) {
cout << i << " ";
}
cout << endl;
for (auto i : v2) {
cout << i << " ";
}
cout << endl;
for (auto i : v3) {
cout << i << " ";
}
cout << endl;
for (auto i : v4) {
cout << i << " ";
}
cout << endl;
for (auto i : v5) {
cout << i << " ";
}
cout << endl;
for (auto i : v6) {
cout << i << " ";
}
cout << endl;
for (auto i : v7) {
cout << i << " ";
}
cout << endl;
//练习3.17 从cin中读入一组词并把它们存入一个vector对象,然后把所有词都改为大写形式,输出改变后的结果
vector<string> words;
string word;
while (cin >> word) {
words.push_back(word);
}
for (auto &i : words) {
for (auto &s : i) {
s = toupper(s);
}
cout << i << endl;
}
//练习3.18 下面的程序合法吗,修改
//vector<int> ivec;
//ivec[0] = 42;
vector<int> ivec = { 42 };
//练习3.19 定义含10个元素的vector对象,所有元素的值都是42,列举三种不同的实现方法
vector<int> iv1(10, 42);//最简洁
vector<int> iv2 = { 42,42,42,42,42,42,42,42,42,42 };
vector<int> iv3(10);
for (auto &i : iv3) {
i = 42;
}
vector<int> iv4;//适用情景最多
for (auto i = 0; i < 10; ++i) {
iv4.push_back(42);
}
//练习3.20 读入一组整数并存入一个vector对象,输出每对相邻整数的和
vector<int> ive;
int i;
while (cin >> i)
ive.push_back(i);
/*for (i = 0; i < ive.size()-1; ++i)
cout << ive[i] + ive[i + 1] << " " ;*/
//改写程序,输出第1个和最后1个元素的和,第2个和倒数第2个元素的和,以此类推
for (i = 0; i < ive.size() / 2; ++i)
cout << ive[i] + ive[ive.size() - 1 - i] << " ";
if (ive.size() % 2)
cout << 2 * ive[ive.size() / 2];
}