C++ 队列出入代码
时间: 2023-07-10 22:17:55 浏览: 103
以下是C++中队列的基本出入队操作代码示例:
```c++
#include <iostream>
#include <queue>
using namespace std;
int main() {
queue<int> q;
// 入队操作
q.push(1);
q.push(2);
q.push(3);
// 出队操作
while (!q.empty()) {
int front_element = q.front();
q.pop();
cout << front_element << endl;
}
return 0;
}
```
在这个示例中,我们定义了一个整型队列 `q`。首先我们使用 `push()` 函数将三个整数元素 1、2、3 入队。然后我们使用 `front()` 函数获取队首元素,并使用 `pop()` 函数将队首元素出队,直到队列为空为止。在出队操作过程中,我们通过 `cout` 语句输出了每个出队元素的值。
相关问题
C++ 队列出入代码,考虑加锁
以下是一个使用 C++11 标准的线程安全的队列实现,包括加锁的出入队操作代码示例:
```c++
#include <iostream>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <thread>
using namespace std;
template <typename T>
class ThreadSafeQueue {
public:
ThreadSafeQueue() {}
// 入队操作
void push(const T& element) {
std::lock_guard<std::mutex> lock(m_mutex);
m_queue.push(element);
m_condition_variable.notify_one();
}
// 出队操作
void wait_and_pop(T& element) {
std::unique_lock<std::mutex> lock(m_mutex);
m_condition_variable.wait(lock, [this] { return !m_queue.empty(); });
element = m_queue.front();
m_queue.pop();
}
bool empty() const {
std::lock_guard<std::mutex> lock(m_mutex);
return m_queue.empty();
}
private:
std::queue<T> m_queue;
mutable std::mutex m_mutex;
std::condition_variable m_condition_variable;
};
int main() {
ThreadSafeQueue<int> q;
// 入队操作
q.push(1);
q.push(2);
q.push(3);
// 出队操作
while (!q.empty()) {
int front_element;
q.wait_and_pop(front_element);
cout << front_element << endl;
}
return 0;
}
```
在这个示例中,我们定义了一个线程安全的队列 `ThreadSafeQueue`,它包含了一个标准队列 `m_queue`,一个互斥锁 `m_mutex` 和一个条件变量 `m_condition_variable`。在 `push()` 函数中,我们使用了一个 `std::lock_guard<std::mutex>` 对象来保证在队列操作期间互斥锁被锁定。在 `wait_and_pop()` 函数中,我们使用了一个 `std::unique_lock<std::mutex>` 对象和条件变量来等待队列非空,并在队列非空时取出队首元素。在 `empty()` 函数中,我们同样使用了一个 `std::lock_guard<std::mutex>` 对象来保证在检查队列是否为空时互斥锁被锁定。
在主函数中,我们首先使用 `push()` 函数将三个整数元素 1、2、3 入队。然后我们使用 `wait_and_pop()` 函数获取队首元素,并在获取到元素后使用 `cout` 语句输出元素的值。在出队操作过程中,我们使用了条件变量和互斥锁来保证线程安全。
C++ 队列出入代码,考虑加锁 qt
以下是一个使用 Qt 框架的线程安全的队列实现,包括加锁的出入队操作代码示例:
```c++
#include <iostream>
#include <queue>
#include <QMutex>
#include <QWaitCondition>
#include <QThread>
using namespace std;
template <typename T>
class ThreadSafeQueue {
public:
ThreadSafeQueue() {}
// 入队操作
void push(const T& element) {
QMutexLocker locker(&m_mutex);
m_queue.push(element);
m_condition_variable.wakeOne();
}
// 出队操作
void wait_and_pop(T& element) {
QMutexLocker locker(&m_mutex);
m_condition_variable.wait(&m_mutex, [this] { return !m_queue.empty(); });
element = m_queue.front();
m_queue.pop();
}
bool empty() const {
QMutexLocker locker(&m_mutex);
return m_queue.empty();
}
private:
std::queue<T> m_queue;
mutable QMutex m_mutex;
QWaitCondition m_condition_variable;
};
int main() {
ThreadSafeQueue<int> q;
// 入队操作
q.push(1);
q.push(2);
q.push(3);
// 出队操作
while (!q.empty()) {
int front_element;
q.wait_and_pop(front_element);
cout << front_element << endl;
}
return 0;
}
```
在这个示例中,我们定义了一个线程安全的队列 `ThreadSafeQueue`,它包含了一个标准队列 `m_queue`,一个 Qt 互斥锁 `m_mutex` 和一个 Qt 条件变量 `m_condition_variable`。在 `push()` 函数中,我们使用了一个 `QMutexLocker` 对象来保证在队列操作期间互斥锁被锁定。在 `wait_and_pop()` 函数中,我们使用了一个 `QMutexLocker` 对象和条件变量来等待队列非空,并在队列非空时取出队首元素。在 `empty()` 函数中,我们同样使用了一个 `QMutexLocker` 对象来保证在检查队列是否为空时互斥锁被锁定。
在主函数中,我们首先使用 `push()` 函数将三个整数元素 1、2、3 入队。然后我们使用 `wait_and_pop()` 函数获取队首元素,并在获取到元素后使用 `cout` 语句输出元素的值。在出队操作过程中,我们使用了条件变量和互斥锁来保证线程安全。注意到 Qt 的 `QMutex` 和 `QWaitCondition` 类都是线程安全的类,因此我们不需要显式地进行锁定和解锁操作。
阅读全文