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, 不用排队。排了也是白排.
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();重新定义字符串长度