C++标准库函数(Vector、Set)
Vector
Vector实际上就是可变长数组,不像是普通的数组,在定义完长度之后不能随意的扩充长度,Vector可以使长度没有那么固定。
一个简单的例子:
Vector容器的定义与三种遍历方式:
#include <iostream>
//使用Vector容器必须定义头文件
#include <vector>
using namespace std;
int main()
{
//Vector的基本定义方法
vector<int> vi;
for (int i = 1; i <= 5; i++) {
//.pushback()用来向Vector的末尾添加数据
vi.push_back(i);
}
//创建迭代器以遍历Vector
vector<int> ::iterator it = vi.begin();
for (int i = 0; i < 5; i++) {
//使用地址++的方式获取整个容器中的数据
printf("%d", *(it + i));
}
printf("\n");
for (int i = 0; i < 5; i++) {
//也可以像普通数组一样进行遍历
printf("%d", vi[i]);
}
return 0;
}
简洁的遍历方式:
int main()
{
vector<int> vi;
for (int i = 0; i <= 5; i++) {
vi.push_back(i);
}
//简洁遍历的方式
//注意vector的迭代器不支持 it < vi.end(),故只能使用it != vi.end()的遍历方式
for (vector<int>::iterator it = vi.begin(); it != vi.end(); it++) {
printf("%d", *it);
}
return 0;
}
Vector的常用函数
一、push_back()、size()
push_back()用于向容器末尾添加一个元素,size()用于获取vector容器的长度。
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> vi;
for (int i = 1; i < 4; i++) {
//向容器的末尾添加1、2、3三个元素
vi.push_back(i);
}
//vi.size()用于获取容器的长度(因为有3个元素所以是3)
for (int i = 0; i < vi.size(); i++) {
printf("%d", vi[i]);
}
return 0;
}
//123
二、pop_back()
pop_back()用于删除容器中的最后一个元素,时间复杂度为O(1).
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> vi;
for (int i = 0; i < 3; i++) {
vi.push_back(i);
}
//删除容器中现在的最后一个元素 (0、1、2) -> (0、1)
vi.pop_back();
for (int i = 0; i < vi.size(); i++) {
printf("%d", vi[i]);
}
return 0;
}
//01
三、clear()
clear()用来清空容器中的所有元素,O(N).
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> vi;
for (int i = 0; i < 5; i++) {
vi.push_back(i);
}
//清空vector中的所有元素
vi.clear();
printf("%d", vi.size());
return 0;
}
//0
四、insert(it, x)
insert()可以向容器中的任意位置(it)添加一个元素(x)
原先it以及it后面位置上的元素都向后移
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> vi;
for (int i = 1; i <= 3; i++) {
vi.push_back(i);
}
//向vi中下标为2的位置添加元素,原先在2后面位置上的元素往后移
vi.insert(vi.begin() + 2, 0);
for (int i = 0; i < vi.size(); i++) {
printf("%d", vi[i]);
}
return 0;
}
//1203
五、erase()
erase(it)代表删除it位置上的元素,所有it后的元素全部前移
erase(first, last)代表删除下标为firsst到last的所有元素,其后面的元素全部前移补齐
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> vi_1;
for (int i = 1; i < 10; i++) {
vi_1.push_back(i);
}
//删除下标为4上面的元素(删除元素5)
vi_1.erase(vi_1.begin() + 4);
for (int i = 0; i < vi_1.size(); i++) {
printf("%d", vi_1[i]);
}
printf("\n");
vector<int> vi_2;
for (int i = 1; i < 10; i++) {
vi_2.push_back(i);
}
//删除下标为4的元素到下标为倒数第三个的元素,左闭右开,即左删右留,删除(5-6)(7因为开区间被留下)
vi_2.erase(vi_2.begin() + 4, vi_2.end() - 3);
for (int i = 0; i < vi_2.size(); i++) {
printf("%d", vi_2[i]);
}
return 0;
}
//12346789
//1234789
Set
Set的定义以及遍历
set没有通过下标进行遍历的方式,只能通过迭代器进行遍历,迭代器同样不支持iterator < xxx的语法,只能使用 it != set.end();
#include<iostream>
#include<set>
using namespace std;
int main() {
set<int> st;
//使用insert进行插入。
st.insert(3);
st.insert(5);
st.insert(2);
st.insert(3);
//使用迭代器进行遍历,不支持it<st.end()
for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
printf("%d", *it);
}
return 0;
}
//235
//通过观察结果可以发现,set容器会自动对元素进行升序排序以及去重。
Set的常用函数
一、Insert(),find()
Insert(x)实现对set容器的添加操作,将x添加到set容器中,会自动去重以及排序。
find(x)会根据x的值找到x对应的迭代器,迭代器找到之后可以对其进行操作,或与erase连用实现删除效果。
#include<iostream>
#include<set>
using namespace std;
int main() {
set<int> st;
for (int i = 1; i <= 3; i++) {
st.insert(i);
}
//find会将入参的元素的迭代器取出并存放在it中。
set<int>::iterator it = st.find(2);
//使用迭代器输出2
printf("%d", *it);
}
//2
二、erase()
erase()可以实现对set容器的删除操作
erase(iterator it)向erase()中传入迭代器,可以使容器以O(1)的复杂度进行对应元素的删除。
erase(T t)向erase()中传入值,可以使容器以O(logN)的复杂度进行对应元素的删除(折半查找)。
erase(iterator first, iterator last)可以向容器中传入两个迭代器,使容器删除两个迭代器之间的所有元素。
#include<iostream>
#include<set>
using namespace std;
int main() {
set<int> st;
st.insert(100);
st.insert(200);
st.insert(100);
st.insert(300);
//利用find找到的迭代器进行删除,时间复杂度为O(1)
st.erase(st.find(100));
for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
printf("%d ", *it);
}
printf("\n");
//直接向erase中传值进行删除,其时间复杂度为O(logN)(折半查找)
st.erase(200);
for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
printf("%d ", *it);
}
printf("\n");
st.insert(20);
st.insert(10);
st.insert(40);
st.insert(30);
//向erase中传入两个迭代器,删除两个迭代器之间的所有元素(左闭右开)(删左不删右)
//注:.end()返回的是末尾元素右边的元素,所以erase(it, st.end())会删除it到末尾的所有元素
set<int>::iterator it_1 = st.find(20);
set<int>::iterator it_2 = st.find(40);
st.erase(it_1, it_2);
for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
printf("%d ", *it);
}
return 0;
}
/*
200 300
300
10 40 300
*/
三、size()、clear()
size()获取容器中元素的个数,clear()清空容器
#include<iostream>
#include<set>
using namespace std;
int main() {
set<int> st;
st.insert(2);
st.insert(5);
st.insert(4);
//获取st的长度
printf("%d", st.size());
printf("\n");
//清空st
st.clear();
printf("%d", st.size());
return 0;
}
/*
3
0
*/