m_queue.emplace和m_queue.push
时间: 2024-10-19 11:09:46 浏览: 9
c++优先队列(priority_queue)用法详解
5星 · 资源好评率100%
`std::queue` 是 C++ 标准库中的一个容器适配器,它提供了先进先出(FIFO,First In First Out)的数据结构。`emplace` 和 `push` 都是用来添加元素到队列尾部的操作,但它们有一些不同。
1. **std::queue::push**:
- 这是一个模板成员函数,用于直接将一个可放的对象推入队列。如果对象不能被放置(例如,`push` 的类型不匹配队列的内部类型),就会抛出异常 `std::bad_alloc` 或者 `std::length_error`,具体取决于容器的行为。
- 语法通常是这样的:
```cpp
template <class T>
void push(const T& value);
```
- 示例:
```cpp
std::queue<int> q;
q.push(5); // 将整数 5 放入队列
```
2. **std::queue::emplace**:
- 这是一个模板成员函数,采用前向移动或构造的方式插入元素。与 `push` 不同的是,`emplace` 允许你在构造新对象时提供默认参数或者使用 lambda 表达式进行初始化,这通常在你希望对象在队列内部被正确构造的情况下很有用。
- 语法类似于 `push`,但可以在构造新元素的同时传递额外的参数:
```cpp
template <class... Args>
void emplace(Args&&... args);
```
- 示例:
```cpp
std::queue<std::string, std::deque<char>> q;
q.emplace("Hello"); // 使用 deque 内部构造一个字符串
```
- 如果没有提供足够的参数完成构造,`emplace` 也会抛出异常。
总结一下:
- `push` 更简单,直接添加已存在的对象;
- `emplace` 提供了构造新对象的功能,可能更高效,因为不需要拷贝或移动数据。
阅读全文