【c++回顾】2.1容器-vector

今天尝试实现一个链式多叉树,多叉树每个节点的内容包括三项:

  • 数据
  • 子节点链表类
  • 父节点地址

结果在嵌入自己的链表类的过程中成功崩溃。。。。
无意中发现c++有个东西叫容器,其中有个经典容器叫vector,据说能存储各种数据类型!当时我就嗨了(尼玛c++的课能不能讲点这些实用的东西(虽然有可能是我忘了-_-))
于是决定改道,先把实现链式多叉树放一放,学习一下c++的STL库,重点学习容器及迭代器。
这个网站有很好的提纲,但是貌似示例程序有点少,需要示例程序的话再单独搜吧。
今天学习了一下vector,验证了vector存储自定义结构体数据的强大。
上代码:

//vector的学习与应用

#include "pch.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;

//定义学生信息体结构,用于试验vector对于结构体的存储效果
struct StudentInfo {
	string name;
	int age;
	string tel;
};
//用户输入学生信息
StudentInfo InputNode()
{
	cout << "请输入学生信息(姓名,年龄,电话):" << endl;
	StudentInfo node;
	cin >> node.name >> node.age >> node.tel;
	return node;
}
//打印学生信息结构体
void PrintStudentInfo(StudentInfo studentinfo)
{
	cout << studentinfo.name << ' ' << studentinfo.age << "岁 电话:" << studentinfo.tel << endl;
}
//打印学生信息结构体vector
void PrintVector_StudentInfo(vector<StudentInfo> studentinfos)
{
	vector<StudentInfo>::iterator it;
	for (it = studentinfos.begin(); it != studentinfos.end(); it++)
	{
		PrintStudentInfo(*it._Ptr);
	}
}
//删除第n个元素
void DeleteVectorElement_StudentInfo(vector<StudentInfo> &studentinfos, int i)
{
	studentinfos.erase(studentinfos.begin() + i);
}
//在第n个位置插入元素,其后元素后移一位
void InsertVectorElement_StudentInfo(vector<StudentInfo> &studentinfos, int i, StudentInfo studentinfo)
{
	studentinfos.insert(studentinfos.begin() + i, studentinfo);
}
//查找数据
//必须传入vector的引用,否则得到的地址是临时vector的地址,函数结束后会被释放。
vector<StudentInfo>::iterator FindVectorElement_StudenInfo(vector<StudentInfo> &studentinfos, string keyword)
{
	vector<StudentInfo>::iterator it;
	for (it=studentinfos.begin();it<studentinfos.end();it++)
	{
		string age = to_string(it._Ptr->age);
		if (it._Ptr->name.find(keyword) != string::npos || it._Ptr->tel.find(keyword) != string::npos || age.find(keyword) != string::npos)
		{
			return it;
		}
	}
	return studentinfos.end();
}
//学生信息结构体型vector
void test2()
{
	//连续从尾部输入
	vector<StudentInfo> studentinfos;
	cout << "学生数量:" << endl;
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)studentinfos.push_back(InputNode());
	PrintVector_StudentInfo(studentinfos);
	//插入数据
	cout << "插入位置:" << endl;
	cin >> n;
	cout << "插入内容:" << endl;
	InsertVectorElement_StudentInfo(studentinfos, n, InputNode());
	PrintVector_StudentInfo(studentinfos);
	//删除数据
	cout << "删除位置:" << endl;
	cin >> n;
	DeleteVectorElement_StudentInfo(studentinfos, n);
	PrintVector_StudentInfo(studentinfos);
	//查找数据
	cout << "查找关键词:" << endl;
	string keyword;
	cin >> keyword;
	vector<StudentInfo>::iterator found_iterator = FindVectorElement_StudenInfo(studentinfos, keyword);
	PrintStudentInfo(*found_iterator._Ptr);
}

//打印整型vector
void PrintVector_int(vector<int> vec)
{
	for (int i = 0; i < vec.size(); i++)//size()容器中实际数据个数 
	{
		cout << vec[i] << ",";
	}
	if (!vec.size())cout << "empty vector";
	cout << endl;
}
//整型vector的申明,排序,添加数据,删除数据,清空容器,打印
void test1()
{
	//创建一个向量存储容器 int
	vector<int> obj;
	// push_back(elem)在数组最后添加数据 
	for (int i = 0; i < 10; i++)
	{
		obj.push_back(i);
	}
	PrintVector_int(obj);
	//从大到小排序
	reverse(obj.begin(), obj.end());
	PrintVector_int(obj);
	//从小到大排序
	sort(obj.begin(), obj.end());
	PrintVector_int(obj);
	//去掉数组最后一个数据 
	for (int i = 0; i < 5; i++)
	{
		obj.pop_back();
	}
	PrintVector_int(obj);
	//声明一个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素 
	vector<int>::iterator it;
	for (it = obj.begin(); it != obj.end(); it++)
	{
		cout << *it << " ";
	}
	//清空vector
	obj.clear();
	PrintVector_int(obj);
}

int main()
{
	test2();
	return 0;
}
/*
输入
2
阿三 33 33333333333
阿四 44 44444444444
2
阿武 55 55555555555
1
3
*/

以上代码中test1()函数参考了这个网站,它对vector的介绍还算比较详细。
运行示例:
在这里插入图片描述
!!注意!!函数传递vector时同样要用地址传参!不用vector的地址的话无法做出修改!
另外,突然感觉string类可以完全替代char,且功能更加强大(只是感觉,没有进行严谨比较),因此今后代码中的字符串均采用string类实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值