3.3.1 定义和初始化vector对象
主要概念
- vector是一个类模版,通过提供一些额外信息来指定模板 到底实例化面干什么样的类,需要提供的信息由模板决定。
- vector需要提供的信息是一个对象的类型
- 定义和初始化一个vector对象的方法:
定义方式 | 说明 |
---|---|
vector<T> v1 | v1是一个空vector,它潜在的元素是T类型的,执行默认初始化 |
vector<T> v2(v1) | v2中包含v1所有元素的副本 |
vector<T> v2 = v1 | 等价于v2(v1) ,v2中包含v1所有元素的副本 |
vector<T> v3 = (n,val) | v3包含了n个重复的元素,每个元素的值都是val |
vector<T> v4 = (n) | v4包含了n个重复的、执行了值初始化的对象 |
vector<T> v5{a,b,c,d...} | v5包含了初始值个数的元素,每个元素被赋予相应的初始值 |
vector<T> v5 = {a,b,c,d...} | 等价于v5{a,b,c,d...} |
- 使用花括号进行初始化时,会优先把花括号内的值当成是元素初始值的列表来进行处理。
练习
- 练习3.12:下列vector对象的定义 有不正确的吗?对于正确的,描述其执行结果,对于不正确 的,说明其错误的原因。
(a) vector<vector<int>> ivec; //合法,声明一个存放vector<int>对象的容器
(b) vector<string> svec = ivec; //不合法,类型不匹配
(c) vector<string> svec(10,"null");//合法,声明一个存放string对象的容器,其中包含十个“null”的string对象
- 练习3.13:下列的vector对象各包含多少个元素?这些元素的值分别是多少?
(a) vector<int> v1; //0个元素
(b) vector<int> v2(10); //10个元素,全部为0
(c) vector<int> v3(10,42); //10个元素,全部为42
(d) vector<int> v4{10};// 1个元素,值为10
(e) vector<int> v5{10,42}; //2个元素,分别为10和42
(f) vector<string> v6{10}; //无法通过编译
(g) vector<string> v7{10,"hi"};//10个元素,全部是"hi"
3.3.2 向vector对象中添加元素
主要概念
- 对于vector对象而言,通常声明一个空vector,运行时再使用成员函数push_back向其中添加元素。
- 使用范围for语句时,不应改变其所遍历序列的大小。
练习
- 练习3.14 编写一段程序 ,用cin读入一组整数 并把它们存入一个vector对象
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> input;
int tempInput;
while(cin){
cin >> tempInput;
input.push_back(tempInput);
}
for(auto&& i : input)
{
cout << i;
cout << "\t";
}
cout << endl;
return 0;
}
- 练习3.15:改写上题的程序 ,不过这次读入的是字符串
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<string> input;
string tempInput;
while(cin){
cin >> tempInput;
input.push_back(tempInput);
}
for(auto&& i : input)
{
cout << i;
cout << "\t";
}
cout << endl;
return 0;
}
3.3.3 其他vector操作
主要概念
- vector还有一些其他的主要操作,比如empty()、size()等。
- vector在判定大于、小于或相等时,提供的类型必须也能够进行判定。
- 特别注意:vector和C#的泛型不同,它并不是类似于C#引用的存在。
- vector的下标仅能用于获取值,不能用于添加值,要添加只能使用push_back。
练习
- 练习3.16:编写一段程序 ,把练习3.13中vector对象的容量和具体内容输出出来。
vector<int> v1; //0个元素
cout << "v1的容量:" << v1.size() << endl;
for (int i = 0; i < v1.size(); i++)
{
cout << "v1的第" << i+1 << "个数据为:" << v1[i] << endl;
}
vector<int> v2(10); //10个元素,全部为0
cout << "v2的容量:" << v2.size() << endl;
for (int i = 0; i < v2.size(); i++)
{
cout << "v2的第" << i+1 << "个数据为:" << v2[i] << endl;
}
vector<int> v3(10, 42); //10个元素,全部为42
cout << "v3的容量:" << v3.size() << endl;
for (int i = 0; i < v3.size(); i++)
{
cout << "v3的第" << i+1 << "个数据为:" << v3[i] << endl;
}
vector<int> v4 {10} ; // 1个元素,值为10
cout << "v4的容量:" << v4.size() << endl;
for (int i = 0; i < v4.size(); i++)
{
cout << "v4的第" << i+1 << "个数据为:" << v4[i] << endl;
}
vector<int> v5 {10, 42}; //2个元素,分别为10和42
cout << "v5的容量:" << v5.size() << endl;
for (int i = 0; i < v5.size(); i++)
{
cout << "v5的第" << i+1 << "个数据为:" << v5[i] << endl;
}
vector<string> v6 {10}; //无法通过编译
cout << "v6的容量:" << v6.size() << endl;
for (int i = 0; i < v6.size(); i++)
{
cout << "v6的第" << i+1 << "个数据为:" << v6[i] << endl;
}
vector<string> v7 {10, "hi"}; //10个元素,全部是"hi"
cout << "v7的容量:" << v7.size() << endl;
for (int i = 0; i < v7.size(); i++)
{
cout << "v7的第" << i+1 << "个数据为:" << v7[i] << endl;
}
输出如下:
v1的容量:0
v2的容量:10
v2的第1个数据为:0
v2的第2个数据为:0
v2的第3个数据为:0
v2的第4个数据为:0
v2的第5个数据为:0
v2的第6个数据为:0
v2的第7个数据为:0
v2的第8个数据为:0
v2的第9个数据为:0
v2的第10个数据为:0
v3的容量:10
v3的第1个数据为:42
v3的第2个数据为:42
v3的第3个数据为:42
v3的第4个数据为:42
v3的第5个数据为:42
v3的第6个数据为:42
v3的第7个数据为:42
v3的第8个数据为:42
v3的第9个数据为:42
v3的第10个数据为:42
v4的容量:1
v4的第1个数据为:10
v5的容量:2
v5的第1个数据为:10
v5的第2个数据为:42
v6的容量:10
v6的第1个数据为:
v6的第2个数据为:
v6的第3个数据为:
v6的第4个数据为:
v6的第5个数据为:
v6的第6个数据为:
v6的第7个数据为:
v6的第8个数据为:
v6的第9个数据为:
v6的第10个数据为:
v7的容量:10
v7的第1个数据为:hi
v7的第2个数据为:hi
v7的第3个数据为:hi
v7的第4个数据为:hi
v7的第5个数据为:hi
v7的第6个数据为:hi
v7的第7个数据为:hi
v7的第8个数据为:hi
v7的第9个数据为:hi
v7的第10个数据为:hi
- 练习3.17: 从cin 读入一组词并把它们存入一个vector对象,然后设法把所有词都专写为大写形式。输入改变后的结果,每个词占一行。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<string> input;
string tempInput;
while(cin){
cin >> tempInput;
for(auto&& i : tempInput)
{
i = toupper(i);
}
input.push_back(tempInput);
}
for(auto&& i : input)
{
cout << i << endl;
}
return 0;
}
- 练习3.18:下面的程序合法吗?如果不合法,你准备如何 修改?
vector<int> ivec;
ivec[0] = 42;
不合法,下标仅能用于取值,应使用push_back()方法
- 练习3.19:如果想定义 一个含有10个元素的vector对象,所有元素的值 都是42,请列举出三种不同的实现方法。
vector<int> v1(10,42); //已知元素数量和值,并且都是相同的值,此方法最好。
vector<int> v2{42,42,42,42,42,42,42,42,42,42};
vector<int> v3;
for(int i = 0;i<10;i++) v3.push_back(42);
- 练习3.20:读入一组整数 并把它们存入一个vector对象 ,将每对相邻整数的和输出出来。然后改写程序 ,要求先输出第一个和最后一个元素的各,接着输出第2个和倒数第2个元素的和,以此类推。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> input;
int tempInput;
while(cin){
cin >> tempInput;
input.push_back(tempInput);
}
cout << "输入总数:" << input.size() - 1<< endl;
for(auto i = 0; i < input.size()-1; i++) //注意,上面循环会导致input中多出一项,所以要-1
{
int res = input[i];
if(i+1<input.size()-1)
{
res += input[i+1];
i++;
}
cout << "当前i值:" << i <<"\t"<< res << endl;
}
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> input;
int tempInput;
while(cin){
cin >> tempInput;
input.push_back(tempInput);
}
cout << "输入总数:" << input.size() - 1 << endl;
for(unsigned int i = 0; i < input.size()-1 - i ; i++)
{
int rightIndex = input.size()- 1 - 1 - i;
int res ;
if(i==rightIndex)
{
res = input[i];
}
else
{
res = input[i] + input[rightIndex];
}
cout << "当前i值:" << i <<"\t"<< res << endl;
}
return 0;
}