c++ STL笔记 3
vector是一个模板类,使用时需要提供具体类型进行实例化int main()return 0;初始化 vector 的方法含义v1 是一个存放 T 类型数据的空 vector利用 v1 构造 v2,v2 包含 v1 的所有数据同上v3 包含 n 个 valv4 包含 n 个默认 T 类型的数据v5 包含初始化列表提供的数据同上int main()Show(v1);Show(v2);Show(v2
vector
vector是 C++ 标准模板库(STL)中最常用的动态数组,它和普通数组的区别:
1.普通数组大小固定,声明后无法修改;
2.vector 大小可以动态增长 / 缩减,自动管理内存(无需手动申请 / 释放,减少内存泄漏风险)。
使用vector必须引用vector头文件
#include <vector>
1 定义与初始化
vector是一个模板类,使用时需要提供具体类型进行实例化
int main()
{
vector<int> v1;
vector<double>v2;
return 0;
}
| 初始化 vector 的方法 | 含义 |
| vector<T> v1 | v1 是一个存放 T 类型数据的空 vector |
| vector<T> v2(v1) | 利用 v1 构造 v2,v2 包含 v1 的所有数据 |
| vector<T> v2 = v1 | 同上 |
| vector<T> v3(n, val) | v3 包含 n 个 val |
| vector<T> v4(n) | v4 包含 n 个默认 T 类型的数据 |
| vector<T> v5{a,b,c,...} | v5 包含初始化列表提供的数据 |
| vector<T> v5 = {a,b,c,...} | 同上 |
void Show(const vector<int>& v)
{
for (const auto& x : v)
cout << x << " ";
cout << endl;
}
int main()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
cout << "v1:";
Show(v1);
vector<int>v2(v1);
cout << "v2:";
Show(v2);
vector<int>v22 = v1;
cout << "v22:";
Show(v22);
vector<int>v3(10, 2);
cout << "v3:";
Show(v3);
vector<int>v4(5);
cout << "v4:";
Show(v4);
vector<int>v5{ 1,2,3,4,5 };
cout << "v5:";
Show(v5);
vector<int>v55 = { 6,7,8,9,10 };
cout << "v55:";
Show(v55);
return 0;
}

2 vector常用迭代器
| 迭代器 | 含义 |
| v.begin() | 第一个元素的迭代器 |
| v.end() | 最后一个元素的下一个位置迭代器 |
| v.cbegin() | 第一个元素的常量迭代器 |
| v.cend() | 尾后常量迭代器 |
| v.rbegin() | 从后往前的第一个迭代器 |
| v.rend() | 从后往前的最后一个迭代器 |
3 vector常用运算符
| 运算符 | 含义 |
| v2 = v1 | 把 v1 的数据赋值给 v2 |
| v1 == v2 | 判断是否相等,索引元素相等 |
| v1 != v2 | 判断是否不相等 |
| <, <=, >, >= | 判断大小关系,从头到尾依次比较 |
| v1[i] | 返回 v1 第 i 个元素的引用,从 0 开始 |
int main()
{
vector<int>v1{ 1,2,3,4,5 };
vector<int>v2 = v1;
cout << "v1:";
Show(v1);
cout << "v2:";
Show(v2);
if (v1 == v2)
cout << "v1==v2" << endl;
v1[2] = 10;
cout << "v1:";
Show(v1);
if (v1 != v2)
cout << "v1!=v2" << endl;
if (v1 < v2)
cout << "v1<v2" << endl;
else if (v1 > v2)
cout << "v1>v2" << endl;
else
cout << "v1==v2" << endl;
return 0;
}

vector 对象不能用 + 运算,也不能通过 << 整体输出所有数据,需要用循环输出。
4 vector常用成员函数
| vector v 的成员函数 | 含义 | vector v 的成员函数 | 含义 |
| v.assign() | 重新赋值数据,可使用 = 替代 | v.erase() | 删除一个或多个元素 |
| v.empty() | 判断是否为空 | v.push_back() | 尾插 |
| v.size() | 返回 v 的数据个数 | v.pop_back() | 尾删 |
| v.capacity() | 返回 v 当前的容量 | v.swap() | 交换两个 vector 的值 |
| v.front() | 返回第一个元素的引用 | v.clear() | 清空数据 |
| v.back() | 返回最后一个元素的引用 | v.resize() | 指定数据个数 |
| v.insert() | 删除一个或多个元素 | v.shrink_to_fit() | 容量紧缩 |
assign成员函数
清除原来的数据,并重新赋值新的数据
int main()
{
vector<int> v1, v2, v3;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
cout << "v1 = ";
Show(v1);
v2.assign(v1.begin(), v1.end());
cout << "v2 = ";
Show(v2);
v3.assign(7, 4); // v3赋值为7个4
cout << "v3 = ";
Show(v3);
v3.assign({5, 6, 7}); // v3赋值为5,6,7
cout << "v3 = ";
Show(v3);
return 0;
}

empty成员函数
判断向量对象是否为空。
size成员函数
获取向量对象中存放的数据个数。
capacity成员函数
向量对象当前开辟的总容量。注意不是数据个数,一般容量≥数据个数,系统根据数据个数自动调整容量大小。
clear成员函数
清空所有数据
int main()
{
vector<int> v1{1,2,3,4,5};
cout << "v1:";
Show(v1);
cout << "v1的数据个数:" << v1.size() << endl;
cout << "v1当前容量:" << v1.capacity() << endl;
v1.push_back(6); // 尾插6
cout << "尾插数据后,v1的数据个数:" << v1.size() << endl;
cout << "尾插数据后,v1当前容量:" << v1.capacity() << endl;
v1.clear(); // 清空数据
cout << "清空后,v1的数据个数:" << v1.size() << endl;
cout << "清空后,v1当前容量:" << v1.capacity() << endl;
if (v1.empty())
cout << "v1是空的" << endl;
return 0;
}

front成员函数
返回 v 第一个元素的引用,作用和 v [0] 相同,注意不能用于空向量。
int main()
{
vector<int> v{1,2,3,4,5};
cout << v.front() << endl;
v.clear();
return 0;
}
back成员函数
返回 v 最后一个元素的引用,作用和 v [v.size ()-1] 相同,注意不能用于空向量。
int main()
{
vector<int> v{1, 2, 3, 4, 5};
cout << v.back() << endl;
cout << v[v.size() - 1] << endl;
v.clear();
return 0;
}

insert成员函数
在指定位置插入一个或者多个元素。
int main()
{
vector<int> v1{1,2,3};
cout << "v1:";
Show(v1);
v1.insert(v1.begin() + 1, 10);
cout << "v1:";
Show(v1);
v1.insert(v1.begin() + 2, 4, 20);
cout << "v1:";
Show(v1);
vector<int> v2{1,2,3,4,5};
vector<int> v3{100, 200, 300};
v2.insert(v2.begin()+1, v3.begin(), v3.end());
cout << "v2:";
Show(v2);
return 0;
}

erase成员函数
删除一个或多个元素
int main()
{
vector<int> v1{1,2,3,4,5};
cout << "v1 = ";
Show(v1);
v1.erase(v1.begin());
cout << "v1 = ";
Show(v1);
v1.erase(v1.begin() + 1, v1.begin() + 3);
cout << "v1 = ";
Show(v1);
return 0;
}

push_back成员函数
尾部插入一个数据
int main()
{
vector<int> v;
for (int i = 0; i < 10; i++)
v.push_back(i);
cout << "v:";
Show(v);
vector<string> v2;
v2.push_back("你好");
v2.push_back("再见");
for (const auto& x : v2)
cout << x << endl;
return 0;
}

pop_back成员函数
删除向量尾部元素
int main()
{
vector<int> v{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
while (!v.empty())
{
cout << v.back() << " ";
v.pop_back();
}
cout << endl;
return 0;
}
![]()
swap成员函数
交换两个向量的所有元素
int main()
{
vector<int>v1{1,2,3,4,5};
vector<int>v2{10,20,30};
cout << "v1:";
Show(v1);
cout << "v2:";
Show(v2);
v1.swap(v2);
cout << "交换后:" << endl;
cout << "v1:";
Show(v1);
cout << "v2:";
Show(v2);
return 0;
}

resize成员函数
为向量指定新的数据个数大小。如果新的大小大于原来的大小,则会在向量末尾添加数据,数据的值为默认值。如果新的大小小于原来的大小,则删除向量末尾多余元素。如果新的大小等于原来的大小则什么也不做。
int main()
{
vector<int>v1{1, 2, 3, 4, 5};
cout << "v1:";
Show(v1);
cout << endl;
v1.resize(10);
cout << "将v1的数据个数设为10后:" << endl;
cout << "v1:";
Show(v1);
cout << endl;
v1.resize(3);
cout << "将v1的数据个数设为3后:" << endl;
cout << "v1:";
Show(v1);
return 0;
}

shrink_to_fit成员函数
收缩容量,使容量和数据个数相同
int main()
{
vector<int> v1{1,2,3,4,5,6,7,8,9,10};
cout << "初始,数据个数:" << v1.size() << ",容量:" << v1.capacity() << endl;
v1.pop_back();
v1.pop_back();
v1.pop_back();
cout << "删除3个数据后,数据个数:" << v1.size() << ",容量:" << v1.capacity() << endl;
v1.shrink_to_fit();
cout << "收缩容量后,";
cout << "数据个数:" << v1.size() << ",容量:" << v1.capacity() << endl;
return 0;
}

更多推荐



所有评论(0)