STL 与 库函数

发布时间 2023-12-14 12:04:24作者: Elgina

STL 与 库函数

1. Vector 的了解

std::vector: 内存连续的,可以动态分配内存,很多时候我们不能提前开好那么大的空间,(例如预处理 1 ~ n 中 所有数的约数),我们就需要得到可变长度数组,这就是vector。 vector还能够实现线性复杂度的插入删除,常数复杂度的随机访问。
std::vector 重载了比较运算符和赋值运算符,这使得我们可以方便的判断两个容器是否相等,此外std::vector还重载了赋值运算符,使得数组拷贝更加方便。
std::vector 重载了 = 运算符,所以我们方便的初始化,此外从C++11起,std::vector还支持列表初始化。例如: std::vector data{1,2,3};

2. vector 常用函数

std::vector<int> v; 
v.empty();  // 返回一个bool 值,即v.begin() == v.end(),true 为 空,反之为 非空。    
v.size();  // 返回容器长度(元素数量)    
v.push_back(x); //  在末尾插入一个元素。均摊复杂度为常数。    
v.pop_back();// 删除末尾元素      
v.clear(); // 清空std::vector    
v.erase(~~); // 删除某个迭代器 或区间内元素。     

关于 v.erase() 的例子:
例如此时需要对std::vector中的元素去重,你可以这样写

std::sort(v.begin(),v.end());
v.erase(std::unique(v.begin(),v.end()),v.end());  // 将重复的移动至末尾,并将其删除。  

vector 中 使用 pair 的例子:
例如需要对已经存入的坐标按照x值升序排列,你可以这样写

vector< pair<int,int> > vec;
vec.push_back({u,v});
bool cmp(pair<int,int> a, pair<int,int> b)
{
    if(a.first == b.first) retun a.second < b.second;
    return a.first < b.first;
}
sort(vec.begin(),vec.end(),cmp);
for(auto it = vec.begin() ; it = vec.end(); it ++)
{
    cout<<it->first << " " <<it->second;
    printf("\n");
}

3.Stack(栈)

std::stack 是一种后进先出(LIFO)的容器,仅支持查询或删除最后一个加入的元素(即栈顶元素),不支持随机访问,且为了保证数据的严格有序性,不支持迭代器。
常用函数:

std::stack<int> stk;
stk.empty();  // 返回一个bool 值,判断栈是否为空,true 为 空,反之为 非空。
q.push(x); // 向栈顶加入元素x。
stk.top(); // 返回 栈顶元素    
stk.pop(); // 栈顶元素出栈 。     

4.queue (队列)

std::queue 是一个队列容器,满足FIFO(先入先出) 的原则。
常用函数:

std::queue<int> q;
q.empty();  // 返回一个bool 值,true 为 空,反之为 非空。
q.push(x); // 向队尾插入元素x。    
q.front(); // 返回队首元素。
q.back(); // 返回队尾元素。
q.pop(); // 队首元素出队。
q.size(); // 返回一个int 类型的数值,表示队列中元素的个数。

5.priority_queue

std::priority_queue 是一个优先队列。顾名思义,也是一个队列容器,它满足std::queue 的所有特性,不同的是,优先队列会将所有的元素按照Compare 排序。
定义时与std::queue 类似,都需要指明数据类型,优先队列还需要指明Compare的内容,但不指明时默认为std::greater,表示从队首到队尾元素依次为降序排序。
若数据类型是结构体 node
由于编译器无法默认的比较两个结构体的大小关系,于是我们需要对小于号 < 进行重载,使之能够对两个结构体变量进行比较:

struct node{
    int x; int y;
    bool operator < (const node &a) const
    {
        return x > a.x;
    }
};
std::priority_queue<node> q;

常用函数:
与std::queue基本一致,主要的不同点在于std::priority_queue中,q.top() 表示队首元素。