通过其值获取std :: queue中元素的索引

gil*_*adk 7 c++ queue stl

是否有一种简单的方法可以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.


Yks*_*nen 5

您可以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)