今天尝试实现一个链式多叉树,多叉树每个节点的内容包括三项:
- 数据
- 子节点链表类
- 父节点地址
结果在嵌入自己的链表类的过程中成功崩溃。。。。
无意中发现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类实现。