std::queue 设置最大长度
时间: 2023-09-05 11:08:23 浏览: 163
标准库中的 std::queue 没有直接设置最大长度的方法,它会动态地分配内存以存储队列中的元素。如果您想限制队列的大小,可以在插入元素时进行检查,当队列大小达到指定值时,禁止插入元素。例如,您可以使用 std::queue 的 size() 函数来获取当前队列的大小,并与您指定的最大长度进行比较,如果超过最大长度,则禁止插入元素。这样可以实现对队列长度的限制。
相关问题
实现下面这个函数。目标是将 valueMap 中按照值 (键值对中的第二个 double 型的数)的顺序,找出最大的 N 个数。通常的输入下,valueMap 的长度为一亿;N<100。 std::map<size_t,double> find_max_N(const std::map<size_t, double> &value_map, size_t N);
可以使用一个辅助数据结构priority_queue(优先队列)来实现,priority_queue是一个基于堆的数据结构,可以将元素按照一定的顺序进行排序,然后取出前N个元素即可。
具体实现如下:
```c++
#include <map>
#include <queue>
std::map<size_t, double> find_max_N(const std::map<size_t, double> &value_map, size_t N) {
// 定义一个小根堆,存储前N个最大值
std::priority_queue<std::pair<double, size_t>, std::vector<std::pair<double, size_t>>, std::greater<>> pq;
// 遍历value_map,将键值对插入到小根堆中
for (const auto &kv : value_map) {
pq.emplace(kv.second, kv.first); // 注意要将键值对的顺序反过来
if (pq.size() > N) { // 如果小根堆中元素数量超过N,弹出堆顶元素
pq.pop();
}
}
// 构造结果map,并将小根堆中的元素按照值从大到小的顺序插入到map中
std::map<size_t, double> result;
while (!pq.empty()) {
auto [value, key] = pq.top();
pq.pop();
result.emplace(key, value);
}
return result;
}
```
在函数中,首先定义了一个小根堆priority_queue,存储前N个最大值。然后遍历value_map,将键值对插入到小根堆中。如果小根堆中元素数量超过N,就弹出堆顶元素。最后,构造结果map,并将小根堆中的元素按照值从大到小的顺序插入到map中。
template <typename MsgT> void Input::registerCallback(ElevationMapping& map, CallbackT<MsgT> callback) { const Parameters parameters{parameters_.getData()}; subscriber_ = nodeHandle_.subscribe<MsgT>( parameters.topic_, parameters.queueSize_, std::bind(callback, std::ref(map), std::placeholders::_1, parameters.publishOnUpdate_, std::ref(sensorProcessor_))); ROS_INFO("Subscribing to %s: %s, queue_size: %i.", parameters.type_.c_str(), parameters.topic_.c_str(), parameters.queueSize_); } 翻译
这是一个 C++ 的函数模板,名为 `registerCallback`,接受两个参数,一个是 `ElevationMapping` 类型的引用,另一个是一个函数模板 `CallbackT`,它接受一个类型为 `MsgT` 的参数。
在函数内部,使用 `parameters_.getData()` 获取参数信息,创建一个名为 `parameters` 的 `const Parameters` 对象。然后使用 `nodeHandle_.subscribe` 函数订阅 `parameters_.topic_` 话题,并指定队列长度为 `parameters.queueSize_`。订阅的回调函数是 `callback`,传入的参数是 `map` 引用、一个消息类型为 `MsgT` 的指针、一个布尔值 `parameters.publishOnUpdate_` 和 `sensorProcessor_` 引用。最后使用 `ROS_INFO` 输出订阅信息。
该函数的作用是注册一个回调函数,当订阅的话题有新的消息时,会调用该回调函数进行处理。