C++标准库类型vector详述(参考书C++primer第五版)

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];
	

	

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《C Primer第五版》是一本经典的C语言教程。该书内容全面并深入浅出,在C语言初学者和进阶者中广受欢迎。 首先,该书从基础知识出发,逐步引导读者深入学习C语言。它详细介绍了C语言的语法规则、数据类型、运算符、流控制结构等基本概念,并通过丰富的示例和习题帮助读者巩固所学知识。 其次,该书注重实践与理论相结合。作者通过讲解实际示例和编写实用的程序,帮助读者理解C语言的应用场景和解决实际问题的方法。此外,书中还介绍了C标准库函数和常见编程技巧,使读者能够更好地运用C语言进行程序开发。 另外,该书特别强调了代码风格和程序设计的规范。它提供了许多编码规范和最佳实践,帮助读者养成良好的编码习惯。这对于初学者来说非常有价值,可以让他们在编程过程中少走弯路并提高代码的可读性和可维护性。 最后,该书还介绍了一些C语言的高级特性和进阶内容。读者可以从中了解到指针、结构体、内存管理、文件操作等高级主题。这对于有一定C语言基础的读者来说,是继续深入学习和提升技能的绝佳选择。 总的来说,《C Primer第五版》是一本循序渐进、内容全面的C语言教材。它适合于C语言初学者入门学习,也适用于有一定基础的读者深入学习和提升技能。无论是作为学习教材还是参考书籍,该书都是值得推荐的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值