front:
1. 在 queue 容器中的用法
queue 是一种先进先出(FIFO)的数据结构, front 函数用来访问队头元素。
int main() {
queue<int> q;
q.push(10);
q.push(20);
int frontElement = q.front(); // 获取队头元素,此时frontElement的值为10
cout << "Queue front element: " << frontElement << endl;
return 0;
}
在这段代码中,先创建了一个 queue 对象 q ,并向其中压入两个元素。然后通过 q.front() 获取队头元素,注意 front 函数只是获取元素,不会改变队列结构,若要移除队头元素需调用 pop 函数。
2. 在 deque 容器中的用法
deque (双端队列 )允许在两端进行插入和删除操作, front 函数用于获取其头部元素。
int main() {
deque<int> dq = {1, 2, 3};
int first = dq.front(); // 获取双端队列头部元素,此时first的值为1
cout << "Deque front element: " << first << endl;
return 0;
}
这里创建了一个包含元素 {1, 2, 3} 的 deque 容器 dq ,通过 dq.front() 获取其头部元素。
3. 在 list 容器中的用法
list 是双向链表容器, front 函数用于获取链表头部元素。
int main() {
list<int> lst = {4, 5, 6};
int head = lst.front(); // 获取链表头部元素,此时head的值为4
cout << "List front element: " << head << endl;
return 0;
}
代码中创建了 list 容器 lst ,并通过 lst.front() 获取其头部元素。
pop_front:
pop_front() 是 C++ 中 双端队列( deque )、列表( list )、前向列表( forward_list ) 等容器的成员函数,用于 删除容器中第一个元素。
1. 语法
container.pop_front(); // container 为支持该操作的容器
2. 适用容器
- deque (双端队列):高效删除头部元素。
- list (双向链表):直接删除头部节点。
- forward_list (单向链表):需注意迭代器有效性。
注意: vector 不支持 pop_front() ,因其头部删除效率低(需移动后续元素)。
3. 示例
int main() {
deque<int> dq = {1, 2, 3};
dq.pop_front(); // 删除第一个元素(1)
// 此时 dq 变为 {2, 3}
return 0;
}
4. 注意事项
调用前需确保容器 非空,否则行为未定义(可能崩溃)。
操作后,容器大小减 1,头部元素变为原第二个元素(若存在)。
pop_back:
pop_back() 是 C++ 中用于 删除容器尾部元素 的成员函数,适用于 vector、deque、list、string 等容器( forward_list 不支持)。
用法示例:
int main() {
vector<int> vec = {1, 2, 3, 4};
vec.pop_back(); // 删除尾部元素 4,容器变为 {1, 2, 3}
cout << "尾部元素:" << vec.back() << endl; // 输出 3
return 0;
}
注意:
- 容器必须非空,否则调用会导致未定义行为(程序崩溃)。
- 操作会直接修改容器,返回值为 void(不返回被删除元素)。
push_back:
push_back() 是C++ 中用于在容器尾部添加元素的成员函数,常用于 vector 、 deque 、 list 和 string 等容器。以下是其用法示例:
int main() {
// 创建一个空的vector容器
vector<int> vec;
// 使用push_back()向容器中添加元素
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
// 输出容器中的元素
for (int i : vec) {
cout << i << " ";
}
return 0;
}
上述代码创建了一个 vector 容器,并使用 push_back() 函数向容器中添加了三个元素,最后通过循环输出了容器中的所有元素。
使用 push_back() 时需要注意,对于 vector 容器,如果当前容器的容量已满,在调用 push_back() 时会自动进行扩容操作,以确保有足够的空间来存储新元素。
que.front:
que.front() 是 C++ 中 队列( queue )容器适配器 的成员函数,用于 访问队列头部元素(即最早插入的元素)。
用法示例:
int main() {
std::queue<int> q;
q.push(10); // 入队:头部元素为 10
q.push(20); // 入队:头部仍为 10(队列先进先出)
cout << "头部元素:" << q.front() << endl; // 输出 10
q.pop(); // 删除头部元素(10)
cout << "新头部元素:" << q.front() << endl; // 输出 20
return 0;
}
注意事项:
1. 队列必须非空:若队列为空时调用 front() ,会导致未定义行为(程序崩溃)。
2. 返回值类型:返回队列头部元素的 引用( T& ),可通过 const 版本( const T& )访问常量队列元素。
3. 与栈的区别:栈( stack )使用 top() 访问栈顶元素(最后插入的元素),而队列使用 front() 访问头部元素(最早插入的元素)。
给你一个整数数组 nums
,有一个大小为 k
的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k
个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6 7 5 1 3 -1 -3 [5 3 6] 7 6 1 3 -1 -3 5 [3 6 7] 7
示例 2:
输入:nums = [1], k = 1 输出:[1]
class Solution {
private:
class MyQueue { // 单调队列(从大到小)
public:
deque<int> que; // 使用deque来实现单调队列
// 每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。
// 同时pop之前判断队列当前是否为空。
void pop(int value) {
if (!que.empty() && value == que.front()) {
que.pop_front();
}
}
// 如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。
// 这样就保持了队列里的数值是单调从大到小的了。
void push(int value) {
while (!que.empty() && value > que.back()) {
que.pop_back();
}
que.push_back(value);
}
// 查询当前队列里的最大值 直接返回队列前端也就是front就可以了。
int front() {
return que.front();
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
MyQueue que;
vector<int> result;
for (int i = 0; i < k; i++) { // 先将前k的元素放进队列
que.push(nums[i]);
}
result.push_back(que.front()); // result记录前k的元素的最大值
for (int i = k; i < nums.size(); i++) {
que.pop(nums[i - k]); // 滑动窗口移除最前面元素
que.push(nums[i]); // 滑动窗口前加入最后面的元素
result.push_back(que.front()); // 记录对应的最大值
}
return result;
}
};
在子函数Myqueue类中定义一个deque(双端队列)对象que,用于存储元素,实现单调队列功能。 定义了一个成员函数pop,接受一个int类型的参数value,用于从队列中弹出指定元素。判断要弹出的值是否为空且弹出的值value等于头部元素。如果满足条件,从队列头部弹出元素。 定义成员函数push,接受一个int类型参数value,用于将元素添加到队列中。当队列非空且新元素value大于队列尾部元素时,进入循环。弹出队列尾部元素,直到新元素不大于队列尾部元素。跳出循环。将新元素value添加到队列尾部。 定义成员函数front,用于获取队列头部元素。返回队列头部元素。 在主在 Solution 类中定义一个公有成员函数 maxSlidingWindow ,接收一个整数数组 nums 和窗口大小 k ,返回一个整数数组,用于求解滑动窗口的最大值。 创建一个 MyQueue 对象 que ,用于维护单调队列。 创建一个 vector 对象 result ,用于存储每个滑动窗口的最大值。循环将数组 nums 的前 k 个元素依次加入单调队列 que 。将 nums[i] 加入单调队列。将前 k 个元素构成的窗口的最大值(即队列头部元素)加入结果数组 result 。从第 k 个元素开始遍历数组 nums ,模拟滑动窗口移动。移除滑动窗口最前面的元素(即离开窗口的元素)。将滑动窗口新加入的元素添加到单调队列。将当前滑动窗口的最大值加入结果数组 result 。返回存储所有滑动窗口最大值的结果数组 result 。