Day1
Vector概念
Vector数据结构和数组很像,也称单端数组
与普通数组的区别是,普通数组是静态数组,而Vector是可以动态扩展的。这里的动态扩展不是在原有的空间之后续接新的空间,而是找到更大的空间,将原数据拷贝到新空间,释放原有空间。
vector的数据是尾插和尾删的,方法如下:
push_back() 存入数据
pop_back() 删除数据
此外front() 代表了容器中的第一个元素,back()代表了最后一个元素。
vector容器的迭代器是支持随机访问的迭代器,常用的迭代器有:
v.begin()指向容器第一个元素
v.rgbgin()指向容器倒数的第一个元素
v.end() 指向容器最后一个元素的下一个位置
v.rend() 指向容器第一个元素的前一个位置
Vector构造函数
功能:创建vector容器
vector<T> v; 使用模板类实现,默认构造函数
vector(v.begin(),v.end()); 将v[begin(),end())区间中的元素拷贝给本身
vector(n,elem) 构造函数将n个elem拷贝给本身
vector(const vector &vec) 拷贝构造函数
1、vector容器中放置数据类型
概括:
容器:vector
算法:for_each
迭代器:vectoe<int> ::iterator
容器对应的头文件为
#include<vector>
void test01()
{
std::vector<int> v;
//向容器中插入数据
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
}
第一种遍历:
//通过迭代器访问容器中的名称
std::vector<int>::iterator itBegin = v.begin(); //起始迭代器 指向容器第一个元素
std::vector<int>::iterator itEnd = v.end(); //结束迭代器 指向容器中最后一个元素的下一个位置
//第一种遍历
while (itBegin != itEnd)
{
std::cout << *itBegin << std::endl;
itBegin++;
}
结果如下:
第二种遍历
//第二种遍历
for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
std::cout << *it << std::endl;
}
第三种遍历
使用STL 提供的遍历算法
注意算法头文件
#include<algorithm> //标准算法头文件
//第三种遍历,使用STL提供的遍历算法
std::for_each(v.begin(), v.end(), MyPrint);
for_each(起点,终点,回调函数)
其实底层源码还是一个for循环
2、存放自定义数据类型
class Entity
{
public:
std::string m_Name;
int m_age;
Entity(std::string name, int age)
{
this->m_Name = name;
this->m_age = age;
}
};
void Vertex()
{
std::vector<Entity> vertices;
Entity e1("aaa", 10);
Entity e2("bbb", 20);
Entity e3("ccc", 30);
Entity e4("ddd", 40);
Entity e5("eee", 50);
//向容器中添加数据
vertices.push_back(e1);
vertices.push_back(e2);
vertices.push_back(e3);
vertices.push_back(e4);
vertices.push_back(e5);
//遍历容器数据
for (std::vector<Entity>::iterator it = vertices.begin(); it != vertices.end(); it++)
{
std::cout << "姓名" << (*it).m_Name << "年龄:" << (*it).m_age << std::endl;
}
}
3、存放自定义数据类型指针
void Vertexptr()
{
std::vector<Entity*> vertices;
Entity e1("aaa", 10);
Entity e2("bbb", 20);
Entity e3("ccc", 30);
Entity e4("ddd", 40);
Entity e5("eee", 50);
//向容器中添加数据
vertices.push_back(&e1);
vertices.push_back(&e2);
vertices.push_back(&e3);
vertices.push_back(&e4);
vertices.push_back(&e5);
//遍历
for (std::vector<Entity*>::iterator it = vertices.begin(); it != vertices.end(); it++)
{
std::cout << "姓名: " << (*it)->m_Name << "年龄: " << (*it)->m_age << std::endl;
}
}
注意,此时(*it)解引用出来是一个指针类型,因此需要调用this指针指向数据成员
输出结果: