c++ primer(第五版)笔记 第三章(2)vector 库初探

#include<iostream>
#include<vector>
#include<string>

using std::string;
using std::vector;
using std::cout;
using std::endl;
using std::cin;

void vector_test();
void practice_3_16();
void practice_3_20();

int main()
{
	vector_test();
	practice_3_16();
	practice_3_20();
	return 0;
}

//打印
void cout_vector(const vector<int> &pv)
{
	for (auto c : pv)
		cout << c << "-";
	cout << endl;
}

void cout_vector_string(const vector<string> &pv)
{
	for (auto c : pv)
		cout << c << "-";
	cout << endl;
}

void vector_test()
{
	//标准库类型 vector 是类模板(class template),并不是类型,表示对象的集合,并且所有的对象类型都相同
	//需要头文件 <vector>
	//实例化(instantiation)时,编译器根据模板名后的尖括号内的类型生成类或函数,除引用外,大部分基本类型和类类型都可以构成 vector 对象,vector 对象也可以作为其元素
	//常用初始化方式
	vector<int> v1;	//空容器
	cout_vector(v1);
	vector<int> v4(5, 9);	//指定元素数量为 5,元素初始值为 9
	cout_vector(v4);
	vector<int> v2(v4);		//将一个容器元素拷贝到另一个容器中,前提是2个容器内的元素类型相同
	cout_vector(v2);
	vector<int> v3 = v4;	//同 v2
	cout_vector(v3);
	vector<int> v5(5);		//指定元素数量为 5,但没有初始值,则创建一个值初始化(value initialized)的元素初值,并赋给所有元素,使用该方法要求1.只能使用()的直接初始化2.类元素不需要提供初始值
	cout_vector(v5);
	vector<int> v6{12,324,63,15,74,12};		//使用初始化列表为每个元素指定了初始值
	cout_vector(v6);
	vector<int> v7 = { 121, 324312, 6312, 151, 174, 12 };	//使用初始化列表为每个元素指定了初始值
	cout_vector(v7);
	vector<int> v8(v6.cbegin(), v6.cend());	//使用迭代器指定了一个范围
	cout_vector(v8);


	//上面的初始化过程,使用了几种不同的方式 ,= () {}
	//除以下情况外,其他情况是可以互换初始化方式的
	//1.拷贝初始化时,即使用 = ,只能提供一个初始值
	//2.对于类内数据成员初始化,可以使用 = 的拷贝初始化和{}的列表初始化,但不能用(),无法与函数声明区分
	//3.如果提供的是所有元素值的列表,只能使用{}的列表初始化,不能用(),无法与函数调用区分

	//元素初始值还是初始个数,可以通过()或{}区分,()表示构造对象,{}表示用值列表来初始化对象,如果值无法初始化元素时,会考虑构造
	vector<int> v9(5);	//v9 含有5 个初始值为 0 的 int
	cout_vector(v9);
	vector<int> v10{5};	//v10 只有一个 int, 值为5
	cout_vector(v10);
	vector<int> v11(5, 7);	//v9 含有5 个初始值为 7 的 int
	cout_vector(v11);
	vector<int> v12{5, 7};	//v9 含有2 个 int, 一个值为5, 一个值为 7
	cout_vector(v12);

	//vector<string> v13("hi");	//无法构建
	vector<string> v14{ "hi" };	//1个元素,值为 "hi"
	cout_vector_string(v14);
	vector<string> v15(5);		//5 个元素,都为空字符串
	cout_vector_string(v15);
	vector<string> v16{5};		//无法用 5 初始化元素,尝试使用构建,5 个元素,都为空字符串
	cout_vector_string(v16);
	vector<string> v17{ 5,"hi" };		//无法用 5 初始化元素,尝试使用构建,5 个元素,都为"hi"
	cout_vector_string(v17);

	//使用 push_back(n) 将 n 压入(push) vector 容器的尾端(back)
	v17.push_back("xi");
	cout_vector_string(v17);

	//可以通过 vector<T>::size_type 类型的下标访问容器内的元素,但不能通过下标添加元素
	decltype(v17.size()) x = 5;
	cout << v17[5] << endl;
	//v17[6] = "ga";		//运行时错误,越界访问不可预知的错误
}
//输入一组字符串,存入vector,然后转为大写输出
void practice_3_16()
{
	string str;
	vector<string> vs;

	while (cin >> str)
		if (!str.empty())
			vs.push_back(str);

	for (auto &s : vs)
	{
		for (auto &c : s)
			c = toupper(c);
		cout << s << endl;
	}
}
//输入一组整数,计算2个相邻数的和,最后依次计算第一个和最后一个,第二个和倒数第二个 。。。的和
void practice_3_20()
{
	int n;
	vector<int> vi;
	decltype(vi.size()) x = 0;

	while (cin >> n)
	{
		vi.push_back(n);
		//计算临值的和
		x = vi.size();
		if (x > 1)
		{
			cout << "sum:" << vi[x - 2] + vi[x - 1] << endl;
		}
	}
	//依次计算第一个和最后一个,第二个和倒数第二个 。。。的和
	x = vi.size();
	if (x < 1)
	{
		cout << "too few num..." << endl;
		return;
	}
	int j = 0, i = (x % 2) ? ((x - 1) / 2) : (x / 2);
	cout << "x:" << x << "i:" << i << endl;
	while (j != i)
	{
		cout << "sum1:" << vi[j] + vi[x - 1 - j] << endl;
		++j;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值