std::queue是一种容器适配器,它通过包装顺序容器来实现队列(先进先出)的数据结构。
template<
class T,
class Container = std::deque<T>
> class queue;
本文章的代码库:
https://gitee.com/gamestorm577/CppStd
成员函数
构造、析构和赋值
构造函数
可以构造一个空的queue,也可以用对应的容器或者另一个queue来构造一个queue。代码示例:
std::vector<int> tmp{1, 2, 3};
std::queue<int, std::vector<int>> q1;
std::queue<int, std::vector<int>> q2(tmp);
std::queue<int, std::vector<int>> q3(q2);
std::cout << "q1 size = " << q1.size() << std::endl;
std::cout << "q2 size = " << q2.size() << std::endl;
std::cout << "q3 size = " << q3.size() << std::endl;
输出结果:
q1 size = 0
q2 size = 3
q3 size = 3
析构函数
销毁queue时,会调用各元素的析构函数。代码示例:
struct MyStruct
{
MyStruct(int i)
: Num(i)
{
}
~MyStruct()
{
std::cout << "~MyStruct: " << Num << std::endl;
}
int Num = 0;
};
std::vector<MyStruct> tmp{1, 2, 3};
std::queue<MyStruct, std::vector<MyStruct>> q(std::move(tmp));
std::cout << "end\n";
输出结果:
~MyStruct: 3
~MyStruct: 2
~MyStruct: 1
end
~MyStruct: 1
~MyStruct: 2
~MyStruct: 3
赋值函数
可以用另一个queue给queue赋值。代码示例:
std::vector<int> tmp{1, 2, 3};
std::queue<int, std::vector<int>> q1(tmp);
std::queue<int, std::vector<int>> q2;
q2 = q1;
std::cout << "q2 size = " << q2.size() << std::endl;
输出结果:
q2 size = 3
元素访问
front
返回第一个元素的引用。代码示例:
std::vector<int> tmp{1, 2, 3};
std::queue<int, std::vector<int>> q(tmp);
std::cout << "q front is: " << q.front() << std::endl;
q.front() += 10;
std::cout << "q front is: " << q.front() << std::endl;
输出结果:
q front is: 1
q front is: 11
back
返回最后一个元素的引用。代码示例:
std::vector<int> tmp{1, 2, 3};
std::queue<int, std::vector<int>> q(tmp);
std::cout << "q back is: " << q.back() << std::endl;
q.back() += 10;
std::cout << "q back is: " << q.back() << std::endl;
输出结果:
q back is: 3
q back is: 13
容量
empty
检查queue是否为空。代码示例:
std::vector<int> tmp{1, 2, 3};
std::queue<int, std::vector<int>> q1(tmp);
std::queue<int, std::vector<int>> q2;
std::cout << std::boolalpha;
std::cout << "q1 empty: " << q1.empty() << std::endl;
std::cout << "q2 empty: " << q2.empty() << std::endl;
输出结果:
q1 empty: false
q2 empty: true
size
返回queue中元素的个数。代码示例:
std::vector<int> tmp{1, 2, 3};
std::queue<int, std::vector<int>> q1(tmp);
std::queue<int, std::vector<int>> q2;
std::cout << "q1 size: " << q1.size() << std::endl;
std::cout << "q2 size: " << q2.size() << std::endl;
输出结果:
q1 size: 3
q2 size: 0
修改器
push
向队列尾部插入元素。代码示例:
std::queue<int, std::vector<int>> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
std::cout << "q front: " << q.front() << std::endl;
std::cout << "q back: " << q.back() << std::endl;
输出结果:
q front: 1
q back: 4
emplace
向队列尾部构造一个元素。代码示例:
struct MyStruct
{
MyStruct(int i)
{
std::cout << "MyStruct: " << i << std::endl;
}
};
std::queue<MyStruct> q;
q.emplace(1);
q.emplace(2);
q.emplace(3);
输出结果:
MyStruct: 1
MyStruct: 2
MyStruct: 3
pop
移除队列的首个元素。代码示例:
std::queue<int> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
while (!q.empty())
{
std::cout << "num: " << q.front() << std::endl;
q.pop();
}
输出结果:
num: 1
num: 2
num: 3
num: 4
swap
和另一个queue交换元素内容。代码示例:
std::vector<int> tmp{1, 2, 3};
std::queue<int, std::vector<int>> q1;
std::queue<int, std::vector<int>> q2(tmp);
q1.swap(q2);
std::cout << "q1 size: " << q1.size() << std::endl;
std::cout << "q2 size: " << q2.size() << std::endl;
输出结果:
q1 size: 3
q2 size: 0
非成员函数
比较运算符
比较两个queue是否相等。代码示例:
std::vector<int> tmp1{1, 2, 3};
std::vector<int> tmp2{3, 2, 1};
std::queue<int, std::vector<int>> q1(tmp1);
std::queue<int, std::vector<int>> q2(tmp2);
std::cout << std::boolalpha;
std::cout << "q1 == q2: " << (q1 == q2) << std::endl;
std::cout << "q1 != q2: " << (q1 != q2) << std::endl;
std::cout << "q1 < q2: " << (q1 < q2) << std::endl;
std::cout << "q1 <= q2: " << (q1 <= q2) << std::endl;
std::cout << "q1 > q2: " << (q1 > q2) << std::endl;
std::cout << "q1 >= q2: " << (q1 >= q2) << std::endl;
输出结果:
q1 == q2: false
q1 != q2: true
q1 < q2: true
q1 <= q2: true
q1 > q2: false
q1 >= q2: false
swap
交换两个queue的元素内容。代码示例:
std::vector<int> tmp{1, 2, 3};
std::queue<int, std::vector<int>> q1;
std::queue<int, std::vector<int>> q2(tmp);
std::swap(q1, q2);
std::cout << "q1 size: " << q1.size() << std::endl;
std::cout << "q2 size: " << q2.size() << std::endl;
输出结果:
q1 size: 3
q2 size: 0