STL容器心得(附代码)

vector

插入:

  • 尾插 — push_back
  • 尾删 — pop_back
  • 插入 — insert (位置迭代器)
  • 删除 — erase (位置迭代器)
  • 清空 — clear
//尾插
v1.push_back(50);

//尾删
v1.pop_back();

//插入
v1.insert(v1.begin(), 100);
v1.insert(v1.begin(), 2, 1000);//迭代器指向位置v1.begin()插入2个元素1000

//删除
v1.erase(v1.begin());

//清空
v1.erase(v1.begin(), v1.end());
v1.clear();

 查找:

要读取 vector 容器的第三个元素,你可以使用 operator[] 或 at()`方法。这两种方法都可以通过索引来获取 vector 中的元素。

1)使用 operator[] 方法:

#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    int third_element = vec[2];  // 获取第三个元素
    std::cout << "Third element: " << third_element << std::endl;
    return 0;
}

2)使用 at() 方法:

#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    int third_element = vec.at(2);  // 获取第三个元素
    std::cout << "Third element: " << third_element << std::endl;
    return 0;
}

这两种方法都会输出 vector 中的第三个元素。记得在使用 at() 方法时,如果索引超出了 vector 的范围,会抛出 std::out_of_range`异常,而使用 operator[] 方法则不会。

3)对于vector容器,可以使用find()算法来在容器中线性查找特定元素,find()返回一个迭代器指向找到的元素,如果没找到则返回容器末尾的迭代器。vector容器的find()用法

auto it=find(nums1.begin(),nums1.end(),num);

注意和set.find(num)的使用区别

set

set<int>st;默认是从小到大排序

class Mycompare{
public:
    bool operator() (int v1,int v2) const{
        return v1>v2;//从大到小排序
    }
};

set<int,Mycompare>st;//从大到小排序

插入:

set.insert(elem); //在容器中插入元素。

查找:

如果你想获取std::set容器中的最后一个元素,可以使用rbegin()函数,它返回一个指向容器中最后一个元素的反向迭代器。然后通过解引用操作符*来获取该元素的值。

#include <iostream>
#include <set>
int main() {
    std::set<int> mySet = {1, 2, 3, 4, 5};
    // 获取最后一个元素的值
    int lastElement = *mySet.rbegin();

    //auto it=st.rbegin();
    //int lastElement = *it;

    // 获取第一个元素的值
    int FirstElement = *mySet.rbegin();
    std::cout << "最后一个元素的值为: " << lastElement << std::endl;
    std::cout << "第一个元素的值为: " << FirstElement << std::endl;
    return 0;
}

***set容器不支持使用下标进行元素查找,可以用map容器进行下标访问(键值充当下标),或者vector容器进行下标访问

//count(key); //统计key的元素个数
int num = s1.count(30);
cout << "num = " << num << endl;

map

插入:

map.insert(pair<char,int>('a',1));
map.insert(make_pair('a',1));
map['a'] = 1;

查找:

map容器和set容器都可以直接使用m.find(num),s.find(num),

而vector容器需要引入#include<algorithm>头文件后,使用v.find(v.begin(),v.end(),num)

在C++的std::map中,当使用map[key]这样的方式去访问容器中的某个键时,如果这个键不存在,std::map会自动插入一个具有默认值的键值对,并返回这个默认值。这种行为可以用于简化代码,但有时也会造成一些意料之外的结果。因此,在使用map[key]时,应该注意确保键存在,或者使用find()方法来判断键是否存在。

if(map[s[i]]!=1);
if(map.find(s[i]) == map.end());

Stack

栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。

stack<T> stk;

数据存取:

  • stk.push(x); //向栈顶添加元素
  • stk.pop(); //从栈顶移除第一个元素
  • stk.top(); //返回栈顶元素

大小操作:

  • stk.empty(); //判断堆栈是否为空
  • stk.size(); //返回栈的大小

queue

queue<T> que; 

数据存取:

  • que.push(x); //往队尾添加元素
  • que.pop(); //弹出队首元素
  • que.back(); //返回最后一个元素
  • que.front(); //返回第一个元素

大小操作:

  • que.empty(); //判断堆栈是否为空
  • que.size(); //返回栈的大小

deque

deque<int> d1
  • deque.empty(); //判断容器是否为空(!deque.empty()表示非空)

  • deque.size(); //返回容器中元素的个数

  • push_back(x); //在容器尾部添加一个数据
  • push_front(x); //在容器头部插入一个数据
  • pop_back(); //弹出容器最后一个数据
  • pop_front(); //弹出容器第一个数据

指定位置操作:

  • insert(pos,x); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。

  • insert(pos,n,x); //在pos位置插入n个elem数据,无返回值。

  • insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。

  • clear(); //清空容器的所有数据

  • erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。

  • erase(pos); //删除pos位置的数据,返回下一个数据的位置。

  • front(); //返回容器中第一个数据元素
  • back(); //返回容器中最后一个数据元素

注意pop_back()和back()以及pop_front()和front()的区别

单调队列

觉得现代官场更加能阐明这个基本道理。比如你这个倒霉蛋25岁二本毕业在机关当科员, 熬了十年后老处长退休, 你们科长升处长, 你升科长。你梦想着再熬10年处长退休·你接班。结果是赵家人不讲武德。直接空降一个25岁的副处。他比你先接班,你等他退休也没戏, 所以这一辈子和处长没关系,自然可以从deque里pop out, 不用排队。排了也是白排.

239. 滑动窗口最大值

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        deque<int>dq;
        vector<int>result;
        for(int i=0;i<k;i++){//先存放第一次的滑动窗口值
            while(!dq.empty()&&nums[i]>dq.back()){//当队首非空且遍历的元素值大于队尾元素
                dq.pop_back();//弹出队尾元素
            }
            dq.push_back(nums[i]);//此时说明没有比nums[i]更小的数了
        }
        result.push_back(dq.front());//将队首的元素存入容器,因为队首元素是最大的
        for(int i=k;i<nums.size();i++){
            if(!dq.empty()&&dq.front()==nums[i-k]){
                //dq不为空,并且队首元素已经是滑动窗口最左边的元素时,需要将队首弹出
                dq.pop_front();
            }
            while(!dq.empty()&&nums[i]>dq.back()){//当队首非空且遍历的元素值大于队尾元素
            dq.pop_back();//弹出队尾元素
                }
            dq.push_back(nums[i]);
             result.push_back(dq.front());
        }
        return result;
    }
};

tip:说句题外话,在while(!dq.empty()&&nums[i]>dq.back()){}执行这里时,之所以在while中先判断是否为空,是因为这样可以避免在队列为空时还做不必要的比较操作。如果先判断大小再判断是否为空,那么很有可能会超时

string

resize();重新定义字符串长度

  • 30
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值