是否有一种简单的方法可以std::queue在C++中通过其值获取元素的位置?
例如:
std::queue<int> numbers;
numbers.push(7);
numners.push(4);
numbers.push(11);
int position = numbers.getPosition(4); //should be 1
Run Code Online (Sandbox Code Playgroud)
眠りネ*_*ネロク 10
如果你想获得一个元素的索引,你应该考虑使用std::deque容器而不是std::queue容器适配器,正如在另一个答案中已经建议的那样.
如果std::queue由于某些其他原因仍希望坚持使用容器适配器,则应该知道它确实通过受保护的数据成员提供对底层容器的访问c.
您可以派生自std::queue以便访问底层容器并使用std::find()函数模板在该容器中查找具有此类值的元素.然后,只需使用返回该元素的位置即可std::distance().
#include <algorithm>
#include <queue>
template<typename T>
class Queue: std::queue<T> {
public:
auto getPosition(const T& val) const {
auto it = std::find(this->c.begin(), this->c.end(), val);
return std::distance(this->c.begin(), it);
}
// ...
};
Run Code Online (Sandbox Code Playgroud)
如果未找到该元素,则索引将对应于size()成员函数返回的索引.
如果存在重复,则基于此的解决方案std::find()将返回第一个的位置,即,使用所请求的值找到的第一个元素val.
您可以std::deque改用:
#include <algorithm>
std::deque<int> names;
names.push_back(7);
names.push_back(4);
names.push_back(11);
auto it = std::find(names.begin(), names.end(), 4);
if(it != names.end())
int distance = it - names.begin();
else
//no element found
Run Code Online (Sandbox Code Playgroud)
请注意,std::queue使用std::deque作为默认实现,因此任何操作都需要与队列中相同的时间。
std::deque也支持随机访问,所以names[0]将返回 7。它也可以像任何其他队列一样使用:
std::deque<int> myDeque{};
myDeque.push_back(5);
myDeque.push_back(13);
std::cout << myDeque.front(); //5
myDeque.pop_front();
std::cout << myDeque.front(); //13
Run Code Online (Sandbox Code Playgroud)