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

1.vector(向量)概述

标准库类型vector表示对象的集合,是一个类模板。vector容纳了一些对象,所以也常称之为容器,其中所有对象的类型都相同。这个集合中的每个对象都有一个与之对应的索引,用于访问指定的对象。编译器根据模板创建类或函数的过程称为实例化。因为引用不是对象,所以不存在包含引用的vector,除此之外的大部分内置类型和类类型都可以构成vector对象,甚至vector的元素也可以是vector。

2.定义和初始化vector对象

#include 
#include 
#include 
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
	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 
#include 
#include 
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 
#include 
#include 
#include 
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 v,它的返回值类型是vector::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 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];
	

	

}

你可能感兴趣的:(C++)