-
定义
- vector的头文件:#include<vector>
- vector是动态数组,与数组不同的是元素个数会随着vector对象个数的增大/减小自动变化(与string相似)
-
包含函数
单口
-
实现动态增长
- 步骤(1.申请新地址[*2] 2.拷贝 3.释放 4.插入)
- 当插入新元素的时候,如果空间不足,那么vector会重新申请更大的一块内存空间,将原空间数据拷贝到新空间,释放旧空间的数据,再把新元素插入新申请空间。
#include<iostream>
//vector容器
using namespace std;
template<typename T>
class DArray
{
T* pdata;
int length;
int size;
public:
DArray(int s)
{
size = s;
length = 0;
pdata = new T[size];
}
void add(T value)
{
if (length < size)
{
pdata[length] = value;
length++;
}
else//空间不足时
{
size = size * 2;
T* temp = new T[size];//申请空间*2
for (int i = 0; i < length; i++)//拷贝
{
temp[i] = pdata[i];
}
delete[]pdata;//把指针指向的空间释放掉,但pdata还在
pdata = temp;//temp给pdata,else结束temp释放
pdata[length] = value;
length++;
}
}
void show() {
for (int i = 0; i < length; i++)
cout << pdata[i] << " ";
}
~DArray() { if (pdata) { delete[]pdata; pdata = NULL; } }
//有new就有delete
};
int main()
{
DArray<int> ary(3);
ary.add(10); ary.add(20); ary.add(30);
ary.add(40); ary.add(50); ary.add(60);
ary.show();
return 0;
}
-
vector的遍历
- vector是顺序表结构,所以遍历类似于顺序表,地址可++
vector<int>::iterator//类中的迭代器
i = v.begin();
for (; i != v.end(); i++)
cout << *i << " ";)//最基本的容器遍历语句
- vector:动态数组/单口容器、顺序存储(顺序表)、随机访问迭代器
- vector分为正向迭代器(begin,end)和反向迭代器(rbegin,rend)
代码如下:
void disp1(vector<int> v)//遍历
{
vector<int>::iterator//类中的迭代器
i = v.begin();
for (; i != v.end(); i++)
cout << *i << " ";
//最基本的容器遍历语句
cout << endl;
}
//反向迭代器
void disp2(vector<int> v)
{
vector<int>::reverse_iterator//类中的迭代器
i = v.rbegin();
for (; i != v.rend(); i++)//++重载了
cout << *i << " ";
//最基本的容器遍历语句
cout << endl;
}
-
vector的初始化
- 三种初始化方法:
- vector<int> v2(2);该语句中2代表空间大小等于元素个数=2,元素初始为默认值(0,0)
- vector<int> v3(3, 10);该语句中3代表空间大小等于元素个数=3,元素初始为10(10 10 10)
- 顺序存储整体初始化
int a[] = { 10,20,30 };
vector<int> v4(a, a + sizeof(a)/sizeof(int));//整体数组(10 20 30)
vector<int> v5(v4.begin(), v4.begin() + 2);//代表左闭右开的区间(10 20)
//创建初始化
void test2()
{
vector<int> v1;
vector<int> v2(2);//2表示空间大小等于元素个数=2(0,0)
disp1(v2);
vector<int> v3(3, 10);//10 10 10
//顺序存储整体初始化
int a[] = { 10,20,30 };
vector<int> v4(a, a + sizeof(a)/sizeof(int));
vector<int> v5(v4.begin(), v4.begin() + 2);//10 20
//迭代器左闭右开(first last)
disp2(v5);
}
-
vector的大小属性
- v.size()表元素个数
- v.capacity()表空间大小
- v.max_size()表系统大小
- v.resize(8);扩容空间为8且自动填充元素
- v.reserve(15);扩容空间为15,不自动填充元素
//大小属性
void test3()
{
vector<int> v(2);//0,0
v.push_back(6);//0 0 6
//表元素个数
cout << v.size() << endl;//2 //3
//空间大小
cout << v.capacity() << endl;//2 满了 //4
//系统大小
cout << v.max_size() << endl;
//resize-----扩容填充
v.resize(8);//不够补默认值,一般为0
//v.resize(8,5)不够补5
cout << v.size() << endl;
cout << v.capacity() << endl;
disp1(v);
//reserve-----扩容
v.reserve(15);
cout << v.size() << endl;
cout << v.capacity() << endl;
disp1(v);
}
-
vector存取数据
- v.push_back()存数据
- 取数据可用数组方法直接取,例如cout << v[1] << endl;
- cout << v.front();//取头
- cout << v.back();//取尾
//存取数据
void test4()
{
//存数据
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
//取数据
cout << v[1] << endl;
cout << v.at(1) << endl;//检测越界
cout << v.front();//取头
cout << v.back();//取尾
cout << *(v.begin() + 2);//+重载 因为是顺序存储,所以地址可加
}
-
vector插入删除
- 插入v.insert(位置,插入数据)
- 插入v.insert(位置,插入个数,插入数据)
- 插入v.insert(w.begin(), v.begin(), v.end())//把v的一段插入到w的特定位置
- w.pop_back();//删尾
- w.erase(w.end() - 1);//删一个位置
- w.erase(w.begin(), w.begin() + 2);//删一段
//插入删除
void test5()
{
int a[] = { 10,20,30 };
vector<int> v(a, a + sizeof(a) / sizeof(int));
//插入
v.insert(v.begin() + 1, 15);
v.insert(v.begin() + 1, 4, 25);//插入了4个25
vector<int> w;
w.insert(w.begin(), v.begin(), v.end());//把v的一段插入到w的特定位置
disp1(w);//10 25 25 25 25 15 20 30
//删除
w.pop_back();//删尾
w.pop_back();//10 25 25 25 25 15
w.erase(w.end() - 1);//10 25 25 25 25
//删一个位置
w.erase(w.begin(), w.begin() + 2);//25 25 25
//删一段
disp1(w);
}
-
用vector建立小型学生信息管理系统
- 定义一个学生类
class stu {
string sno;
string name;
int score;
public:
stu(string no, string n, int s)
{
sno = no; name = n; score = s;
}
void show() {
cout << sno << " " << name << " " << score << endl;
}
string getsno() { return sno; }
void setscore(int s) { score = s; }
};
- 定义一个管理类实现增删改查
class Manage
{
vector<stu> v;//容器中放符合类型
public:
//增删改查遍历
//增加
void add(stu s)
{
v.push_back(s);
}
//查找
vector<stu>::iterator chaxun(string no)
{
vector<stu>::iterator//类中的迭代器
i = v.begin();
for (; i != v.end(); i++)
{
if ((*i).getsno() == no)
{
(*i).show(); break;
}
}
return i;
}
//删除
void shanchu(string no)
{
vector<stu>::iterator i=chaxun(no);
if (i != v.end()) v.erase(i);
}
//遍历
void disp()
{
vector<stu>::iterator//类中的迭代器
i = v.begin();
for (; i != v.end(); i++)
(*i).show();//用stu.show()
//不是基本数据对象不能直接
//i->show();
//最基本的容器遍历语句
cout << endl;
}
//修改
void xiugai(string no)
{
vector<stu>::iterator//类中的迭代器
i = v.begin();
for (; i != v.end(); i++)
if (i != v.end()) (*i).setscore(100);
}
};
测试代码如下:
void test1()
{
stu s1("1001", "zhang", 65),
s2("1002", "wang", 75),
s3("1003", "lang", 85);
Manage m;
m.add(s1); m.add(s2); m.add(s3);
m.disp();
cout << "查询结果是" << endl;
m.chaxun("1002");
cout << "删除结果是" << endl;
m.shanchu("1002");
m.disp();
cout << "修改结果是" << endl;
m.xiugai("1003");
m.disp();
}