C++基础——STL
vector
一. vector数组的初始化
1.1 一维vector数组的初始化
//1. 数组长度由外部输入确定
int n;
cin >> n;
vector<int> a(n);
//2. 数组长度由自己指定
vector<int> b(10);
//3. 直接定义数组元素
vector<int> c = { 1,2,3,4,5 }; //列表初始化,注意使用的是花括号
1.2 二维vector数组的初始化
vector<vector<int>> res;
//1. 数组长度由外部输入确定
int n;
cin >> n;
vector<vector<int>> a(n, vector<int>(n, 0));
//2. 定义第一维固定长度为5,第二维可变化的二维数组
vector<int> b[5];
//注意:行是不可变的(只有5行),而列可变可以在指定行添加元素;第一维固定长度为5,第二维长度可以改变
//3. 直接定义数组元素
vector<vector<int>> nums{ {1,2,3,4,5},{1,2,3,4,5}};
二. vector数组的常用方法
2.1 常用内置函数
vector<int> a;
vector<int> b = {1, 2, 3, 4, 5};
//b为向量,将b的0-2个元素赋值给向量a
a.assign(b.begin(), b.begin() + 3);
//将a重置为包含4个2的数组
a.assign(4, 2);
//返回a的最后一个元素
a.back();
//返回a的第一个元素
a.front();
//清空a中的元素
a.clear();
//判断a是否为空,空则返回true,非空则返回false
a.empty();
//删除a向量的最后一个元素
a.pop_back();
//删除a中第一个(从第0个算起)到第二个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)结束
a.erase(a.begin(), a.begin() + 3);
//在a的最后一个向量后插入一个元素,其值为5
a.push_back(5);
//在a的第一个元素(从第0个算起)位置插入数值5,
a.insert(a.begin() + 1, 5);
//在a的第一个元素(从第0个算起)位置插入3个数,其值都为5
a.insert(a.begin() + 1, 3, 5);
//b为数组,在a的第一个元素(从第0个元素算起)的位置插入b的第三个元素到第5个元素(不包括b+6)
a.insert(a.begin() + 1, b + 3, b + 6);
//返回a中元素的个数
a.size();
//将a的现有元素个数调整至10个,多则删,少则补,其值随机
a.resize(10);
//将a的现有元素个数调整至10个,多则删,少则补,其值为2
a.resize(10, 2);
//将a的容量扩充至100,
a.reserve(100);
//b为向量,将a中的元素和b中的元素整体交换
a.swap(b);
//b为向量,向量的比较操作还有 != >= > <= <
a == b; //判断向量a和b中的每个元素是否相等
2.2 常用算法
//1. 对a中的元素倒置
reverse(a.begin(),a.end());
//2. 在b中找某个值,可以使用迭代器访问
vector<int>::iterator it = find(b.begin(), b.end(), 3);
if (it == b.end())
cout << "NO" << endl;
else
cout << "YES" << endl;
for(vector<int>::iterator it=b.begin();it!=b.end();it++){
cout<<*it<<" ";
}
//3. 也可以直接使用find
if (find(b.begin(), b.end(), 1) != b.end()) {
cout << "YES";
}
//4. 使用迭代器查找元素在数组中的位置
vector<int>::iterator element = find(temp.begin(), temp.end(), nums[i]);
int pos = distance(temp.begin(), element); //返回的是元素在数组中的位置(从0开始)
2.3 迭代器的使用
bool cmp1(pair<int, int>a, pair<int, int>b)
{
return a.first < b.first;
}
//main函数:
vector<pair<int, int>>vec;
vec.push_back({ 1,2 });
vec.push_back({ 4,2 });
vec.push_back({ 3,3 });
vec.push_back({ 2,1 });
sort(vec.begin(), vec.end(), cmp1);
cout << "根据first的值升序排序:" << endl;
for (auto it = vec.begin(); it != vec.end(); it++)
{
cout << "(" << it->first << "," << it->second << ")" << endl;
}
注意:vi[i] 和 *(vi.begin() + i) 等价
map
一. map的介绍
map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据按键的大小自动排序的功能,所以在map内部所有的数据都是有序的。
二. map的内置函数
mp.find(key) | 返回键为key的映射的迭代器 O(logN) 注意:用find函数来定位数据出现位置,它返回一个迭代器。当数据存在时,返回数据所在位置的迭代器,数据不存在时,返回mp.end() |
---|---|
mp.erase(it) | 删除迭代器对应的键和值O(1) |
mp.erase(key) | 根据映射的键删除键和值 O(logN) |