C++ Primer学习笔记 - 15 - 字符串、向量和数组 (三)

3.3.1 定义和初始化vector对象

主要概念

  1. vector是一个类模版,通过提供一些额外信息来指定模板 到底实例化面干什么样的类,需要提供的信息由模板决定。
  2. vector需要提供的信息是一个对象的类型
  3. 定义和初始化一个vector对象的方法:
定义方式说明
vector<T> v1v1是一个空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...}
  1. 使用花括号进行初始化时,会优先把花括号内的值当成是元素初始值的列表来进行处理。

练习

  1. 练习3.12:下列vector对象的定义 有不正确的吗?对于正确的,描述其执行结果,对于不正确 的,说明其错误的原因。
(a) vector<vector<int>> ivec; //合法,声明一个存放vector<int>对象的容器
(b) vector<string> svec = ivec; //不合法,类型不匹配
(c) vector<string> svec(10,"null");//合法,声明一个存放string对象的容器,其中包含十个“null”的string对象
  1. 练习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对象中添加元素

主要概念

  1. 对于vector对象而言,通常声明一个空vector,运行时再使用成员函数push_back向其中添加元素。
  2. 使用范围for语句时,不应改变其所遍历序列的大小。

练习

  1. 练习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;
}
  1. 练习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操作

主要概念

  1. vector还有一些其他的主要操作,比如empty()、size()等。
  2. vector在判定大于、小于或相等时,提供的类型必须也能够进行判定。
  3. 特别注意:vector和C#的泛型不同,它并不是类似于C#引用的存在。
  4. vector的下标仅能用于获取值,不能用于添加值,要添加只能使用push_back。

练习

  1. 练习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

  1. 练习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;
}
  1. 练习3.18:下面的程序合法吗?如果不合法,你准备如何 修改?
vector<int> ivec;
ivec[0] = 42;

不合法,下标仅能用于取值,应使用push_back()方法

  1. 练习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);

  1. 练习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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值