包含头文件<vector>
vector<int> vecData;
-
模板类型:存储数据类型(数组的类型):int
-
不带长度 / 带长度的创建方式、带初始化的创建方式
处理基本数据类型
不带长度的创建方式
//辅助函数:遍历容器
template <class _Ty>
void printVector(vector<_Ty>& temp)
{
for (auto v : temp)
{
cout << v << "\t ";
}
cout << endl;
}
//要存储的数据类型写在<>中
void testCreateVector()
{
vector<int> vecData;
//只能采用成员函数的方式做插入 插入多少个元素都可以自动扩建
for (int i = 0; i < 3; i++)
{
vecData.push_back(i); //尾插法 0 01 012
}
printVector(vecData);
}
int main() {
testCreateVector();
}
/*输出*/
0 1 2
带长度的创建方式
确定长度可以直接使用数组法插入→ 在长度范围以内可以直接采用数组法插入,超出的必须要用成员函数插入→ vector subscript out of range (下标超出范围)
//辅助函数:遍历容器
template <class _Ty>
void printVector(vector<_Ty>& temp)
{
for (auto v : temp)
{
cout << v << "\t ";
}
cout << endl;
}
void testCreateVector()
{
vector<string> strData(3); //当前动态数组的长度是3
for (int i = 0; i < 3; i++) //确定长度,可以直接使用数组法插入
{
string name = "name";
//只有在确定长度范围以内的才可以直接采用数组法(下标)插入
strData[i] = name + to_string(i);
}
printVector(strData);
//strData[3] = "name3"; vector subscript out of range 引发中断
strData.push_back("name3"); //超过的必须用成员函数插入(会自动扩增)
printVector(strData);
}
int main() {
testCreateVector();
}
/*输出*/
name0 name1 name2
name0 name1 name2 name3
带初始化的创建方式
//辅助函数:遍历容器
template <class _Ty>
void printVector(vector<_Ty>& temp) {
for (auto v : temp)
{
cout << v << "\t ";
}
cout << endl;
}
void testCreateVector() {
//带初始化
vector<double> dData = { 1.1,1.23,1.44 }; //自动推断长度为3
printVector(dData);
}
int main() {
testCreateVector();
}
/*输出*/
1.1 1.23 1.44
vector的其他调用形态 ---> 分配器
自己写内存的申请和释放:特殊的对象需要自己释放内存,管理c语言的文件操作(定义文件指针File* fp 不能用delete释放,必须要调用c语言的free函数释放)-> 单独写一个类当作它的分配器
push_back()
//辅助函数:遍历容器
template <class _Ty>
void printVector(vector<_Ty>& temp)
{
for (auto v : temp)
{
cout << v << "\t ";
}
cout << endl;
}
int main(){
vector<int> intData(3);
intData.push_back(1111); //前面3个值都是垃圾值,在容器中赋值为0在原来内存的后面扩增
printVector(intData); //push_back()前面的3个元素还在 0 0 0 1111
}
/*输出*/
0 0 0 1111
遍历方式2→ 可以用迭代器做遍历,所有用迭代器遍历都是统一操作
//迭代器遍历
int main(){
vector<int> intData(3);
intData.push_back(1111);
vector<int>::iterator iter;
for (iter = intData.begin(); iter != intData.end(); iter++)
{
cout << *iter << "\t";
}
cout << endl;
}
/*输出*/
0 0 0 1111
处理自定义类型数据 ---> 关键点在于重载
智能指针 → 用对象取代指针的使用方式
与定长数组的区别:array 管理自定义类型必须要无参构造函数,vector 不需要无参构造函数
//辅助函数:遍历容器
template <class _Ty>
void printVector(vector<_Ty>& temp)
{
for (auto v : temp)
{
cout << v << "\t ";
}
cout << endl;
}
//自定义类型数据
class MM
{
public:
MM(string name, int age) :name(name), age(age) {}
//重载运算符即可
friend ostream& operator<<(ostream& out, const MM& temp)
{
out << temp.name << "\t" << temp.age;
return out;
}
protected:
string name;
int age;
};
void testUserData()
{
vector<MM> mmData;
//vector<MM> mmData(3); 带长度的也不需要
for (int i = 0; i < 3; i++)
{
string name = "name";
mmData.push_back(MM(name + to_string(i), 18 + i));
}
//二进制“<<”: 没有找到接受“MM”类型的右操作数的运算符(或没有可接受的转换)
printVector(mmData);
}
int main()
{
testUserData();
return 0;
}
vector 的其他操作
所有容器都是用迭代器描述位置的,不存在直接的指针操作
//辅助函数:遍历容器
template <class _Ty>
void printVector(vector<_Ty>& temp)
{
for (auto v : temp)
{
cout << v << "\t ";
}
cout << endl;
}
void testExOperator()
{
vector<int> iData = { 1,2,3,4 };
cout << iData.size() << endl; //当前容器中的元素个数
cout << iData.empty() << endl; //判断是否为空 return size==0; 有元素返回false
cout << iData.front() << endl; //访问第一个元素
cout << iData.back() << endl; //访问最后一个元素
cout << iData.at(2) << endl; //直接用下标法访问,返回当前下标下面的值
cout << iData[2] << endl; //和at(2)一样效果 用于表示元素不能 &iData[2] 没有重载&
iData.emplace(iData.begin()+2, 100);/*在指定位置插入一个新的元素,用迭代器去指定位置,传入
的是位置,往第2个位置插入100 */
iData.emplace(iData.begin(), 1111); //往第一个位置插入元素
printVector(iData);
iData.emplace_back(999); //和 push_back 一样的功能
//iData.erase(iData.begin() + 2); //数组只有伪删除,没有删除操作(万金油函数,链表中有用)
printVector(iData);
//批量复制 想把一个数组的内容拷贝到一个向量中去--->用迭代器去指定位置
int array[] = { 1,2,3 }; //一个普通数组赋值为1,2,3
vector<int> vecData; //不需要起始长度--->构建的是对象,会自动释放
vecData.assign(array, array + 3); /*赋值的方式,把数组中的东西赋值给另一个数组(把元素的
第一个位置到最后一个位置拷贝到容器中)*/
printVector(vecData);
}
int main() {
testExOperator();
}
/*输出*/
4
0
1
4
3
3
1111 1 2 100 3 4
1111 1 2 100 3 4 999
1 2 3
empty()
void testExOperator()
{
vector<int> iData;
cout << iData.size() << endl; //当前容器中的元素个数
cout << iData.empty() << endl; //判断是否为空
}
int main() {
testExOperator();
}
/*输出*/
0
1