百度apollo自动驾驶planning代码学习-Apollo\modules\planning\common\IndexedQueue类代码详解

本文介绍了Apollo planning模块中的IndexedQueue类,它是一个模板类,用于存储特定类型数据并支持高效查找和管理,通过id映射实现数据检索。容量可设,支持插入、查询和清空操作,是数据管理的实用工具。
摘要由CSDN通过智能技术生成

概述

IndexedQueue类是apollo planning模块下modules\planning\common\indexed_queue.h实现,代码比较简单,功能一眼比较明晰,代码不做详细解析,仅介绍每个函数作用。

从类名来看,应该是索引队列类?

从代码来看IndexedQueue类主要是实现:
看其数据成员很容易发现,一共3个
容量capacity_
队列queue_
id和队列里每个对象的映射map map_
其实该类就是实现一个队列,储存某一类型的数据对象的队列,可以设置队列的长度,同时储存id和队列里每个对象的映射map,然后可以根据id查询相应的数据对象,返回队列里的最后一个即最新的对象,在类map里增加一对(id,对象)映射数据,清空队列等。

也是个通用的小工具,就是实现了一个更高级的队列?可以用id去查询相应的对象

indexed_queue.h

#pragma once

#include <memory>
#include <queue>
#include <unordered_map>
#include <utility>

#include "modules/common/util/map_util.h"

namespace apollo {
namespace planning {

//模板类
template <typename I, typename T>
class IndexedQueue {
 public:
  //初始化索引队列的容量,用0代表无穷大?
  explicit IndexedQueue(size_t capacity) : capacity_(capacity) {}

//根据id查询相应的对象
  const T *Find(const I id) const {
    auto *result = apollo::common::util::FindOrNull(map_, id);
    return result ? result->get() : nullptr;
  }

//返回队列里的最后一个对象,即最新的对象
  const T *Latest() const {
    if (queue_.empty()) {
      return nullptr;
    }
    return Find(queue_.back().first);
  }

//在类map里增加一对(id,对象)映射数据
  bool Add(const I id, std::unique_ptr<T> ptr) {
    if (Find(id)) {
      return false;
    }
    if (capacity_ > 0 && queue_.size() == capacity_) {
      map_.erase(queue_.front().first);
      queue_.pop();
    }
    queue_.emplace(id, ptr.get());
    map_[id] = std::move(ptr);
    return true;
  }

//清空队列?
  void Clear() {
    while (!queue_.empty()) {
      queue_.pop();
    }
    map_.clear();
  }

 public:
  size_t capacity_ = 0;
  std::queue<std::pair<I, const T *>> queue_;
  std::unordered_map<I, std::unique_ptr<T>> map_;
};

}  // namespace planning
}  // namespace apollo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wujiangzhu_xjtu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值