原址

【用法示例】

在 Android Framework 源码中经常可以看到使用 DefaultKeyedVector 类型的容器。举个例子,在 AudioPolicyManagerBase.cpp 中我们可以看到如下代码:

[cpp] view plaincopy print?
  1. SortedVector<audio_io_handle_t> AudioPolicyManagerBase::getOutputsForDevice(audio_devices_t device,
  2. DefaultKeyedVector<audio_io_handle_t, AudioOutputDescriptor *> openOutputs)
  3. {
  4. SortedVector<audio_io_handle_t> outputs;
  5. ALOGVV("getOutputsForDevice() device %04x", device);
  6. for (size_t i = 0; i < openOutputs.size(); i++) {
  7. ALOGVV("output %d isDuplicated=%d device=%04x",
  8. i, openOutputs.valueAt(i)->isDuplicated(), openOutputs.valueAt(i)->supportedDevices());
  9. if ((device & openOutputs.valueAt(i)->supportedDevices()) == device) {    // 获取第 i 个元素的 value,并查看支持的设备
  10. ALOGVV("getOutputsForDevice() found output %d", openOutputs.keyAt(i));
  11. outputs.add(openOutputs.keyAt(i));    // 获取第 i 个元素的 key,并添加到 outputs 向量容器中
  12. }
  13. }
  14. return outputs;
  15. }

可以看到,openOutputs 是一个 DefaultKeyedVector 键值对类型的容器。在代码中,使用 openOutputs.size() 来获取到该容器中的元素个数,使用 openOutputs.valueAt(i) 来获取到该容器的第 i 个元素的 value 值,使用 openOutputs.keyAt(i) 来获取到该容器的第 i 个元素的 key 值。而 outputs 是一个 SortedVector 类型的容器。在代码中,使用 outputs.add() 方法来将从 openOutputs 中获取到的 key 值添加到 outputs 容器中。

【源码定义】

DefaultKeyedVector 类型容器实际上是一个模板类,继承自 KeyedVector 模板类,实现在 KeyedVector.h 文件中。除了 size()、valueAt()、keyAt()、add() 方法之外,其它常用的方法还有譬如 isEmpty()、replaceValueAt()、removeItem() 等,均可在源码中找到。

KeyedVector 类定义如下:

[cpp] view plaincopy print?
  1. template <typename KEY, typename VALUE>
  2. class KeyedVector
  3. {
  4. public:
  5. typedef KEY    key_type;
  6. typedef VALUE  value_type;
  7. inline                  KeyedVector();
  8. /*
  9. * empty the vector
  10. */
  11. inline  void            clear()                     { mVector.clear(); }
  12. /*!
  13. * vector stats
  14. */
  15. //! returns number of items in the vector
  16. inline  size_t          size() const                { return mVector.size(); }
  17. //! returns whether or not the vector is empty
  18. inline  bool            isEmpty() const             { return mVector.isEmpty(); }
  19. //! returns how many items can be stored without reallocating the backing store
  20. inline  size_t          capacity() const            { return mVector.capacity(); }
  21. //! sets the capacity. capacity can never be reduced less than size()
  22. inline ssize_t          setCapacity(size_t size)    { return mVector.setCapacity(size); }
  23. // returns true if the arguments is known to be identical to this vector
  24. inline bool isIdenticalTo(const KeyedVector& rhs) const;
  25. /*!
  26. * accessors
  27. */
  28. const VALUE&    valueFor(const KEY& key) const;
  29. const VALUE&    valueAt(size_t index) const;
  30. const KEY&      keyAt(size_t index) const;
  31. ssize_t         indexOfKey(const KEY& key) const;
  32. const VALUE&    operator[] (size_t index) const;
  33. /*!
  34. * modifying the array
  35. */
  36. VALUE&          editValueFor(const KEY& key);
  37. VALUE&          editValueAt(size_t index);
  38. /*!
  39. * add/insert/replace items
  40. */
  41. ssize_t         add(const KEY& key, const VALUE& item);
  42. ssize_t         replaceValueFor(const KEY& key, const VALUE& item);
  43. ssize_t         replaceValueAt(size_t index, const VALUE& item);
  44. /*!
  45. * remove items
  46. */
  47. ssize_t         removeItem(const KEY& key);
  48. ssize_t         removeItemsAt(size_t index, size_t count = 1);
  49. private:
  50. SortedVector< key_value_pair_t<KEY, VALUE> >    mVector;    // 重要!将 key-value 整体作为 key_value_pair_t 元素存入到 SortedVector 中
  51. };

在 KeyedVctor 类声明的最后一行,我们看到实际上在内部将每个 key-value 键值对作为一个元素整体存入到 key_value_pair_t 模板结构体中,再把每个 key_value_pair_t 作为元素存入到一个名为 mVector 的 SortedVector 类型排序向量容器中。实际上在调用 valueAt()、keyAt() 等方法时,都是使用了 SortedVector 模板类和 key_value_pair_t 模板结构体的方法和特性。实现代码如下:

[cpp] view plaincopy print?
  1. template<typename KEY, typename VALUE> inline
  2. const VALUE& KeyedVector<KEY,VALUE>::valueAt(size_t index) const {
  3. return mVector.itemAt(index).value;    // 返回mVector中第index个key_value_pair_t元素的value
  4. }
  5. template<typename KEY, typename VALUE> inline
  6. const KEY& KeyedVector<KEY,VALUE>::keyAt(size_t index) const {
  7. return mVector.itemAt(index).key;    // 返回mVector中第index个key_value_pair_t元素的key
  8. }

DefaultKeyedVector 类是从 KeyedVector 类继承而来的,其定义如下:

[cpp] view plaincopy print?
  1. /**
  2. * Variation of KeyedVector that holds a default value to return when
  3. * valueFor() is called with a key that doesn't exist.
  4. */
  5. template <typename KEY, typename VALUE>
  6. class DefaultKeyedVector : public KeyedVector<KEY, VALUE>
  7. {
  8. public:
  9. inline                  DefaultKeyedVector(const VALUE& defValue = VALUE());
  10. const VALUE&    valueFor(const KEY& key) const;
  11. private:
  12. VALUE                                           mDefault;
  13. };

可以看到,相较于基类 KeyedVector 而言,DefaultKeyedVector 类只是添加了 valueFor() 方法和一个默认 value 值 mDefault。

DefaultKeyedVector和KeyedVector用法相关推荐

  1. note_2020_5

    具体再分析下 Camera的open流程,上面我们分析到上层调用到HAL层的camera_module_t结构体的open_legacy函数,也就是映射到QCamera2Factory的open_le ...

  2. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  3. Pandas_transform的用法

    先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...

  4. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  5. pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...

  6. python yield 和 yield from用法总结

    #例1. 简单输出斐波那契數列前 N 个数 #缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 #要提高 fab 函数的可复用性,最好不要直接打印出数列,而 ...

  7. tf.nn.embedding_lookup()的用法

    函数: tf.nn.embedding_lookup( params, ids, partition_strategy='mod', name=None, validate_indices=True, ...

  8. OpenMP用法大全

    OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...

  9. Dorado用法与示例

    Dorado用法与示例 dorado用后总结 一.dorado概念 dorado的产品全名是"dorado展现中间件".从产品形态上dorado由两部分组成,第一部分是一个具有AJ ...

最新文章

  1. java 深拷贝 流_(转)Java技巧:深拷贝的两种方式
  2. SAP MM 带有Return标记的STO,不能创建内向交货单?
  3. java中的ThreadLocal
  4. Apache RocketMQ 的 Service Mesh 开源之旅
  5. expsky.php,Typecho漏洞利用工具首发,半分钟完成渗透
  6. mysql 支持json_MySQL 5.7 对 JSON 的支持
  7. linux内核开源不能仿照_Linux内核开发,开源生产力工具,使用Google应用程序创建自动日历等
  8. python获取sap数据_python 连接 SAP HANA 数据库
  9. 极限学习机(Extreme Learning Machine, ELM)原理详解和MATLAB实现
  10. 【算法:leetcode】双指针:142. 环形链表 II 633. 平方数之和
  11. 存储结构的定义及其分类
  12. 魔兽世界资料片:燃烧的远征
  13. MHL技术剖析,比HDMI更强的东东
  14. 深度学习去燥学习编码_有关自己学习编码的最困难的事情以及如何解决它们
  15. 01 创建一个二维地图
  16. 2021年京东最新炸年兽活动用脚本会怎样?JD炸年兽活动参与教程
  17. 树莓派的mjpeg-streamer实现简单的监控功能
  18. hibernate一对一主键关联映射(一)---单向关联
  19. 前端报错Unknown custom element
  20. Posix API 与 网络协议栈 详细介绍

热门文章

  1. jquery 甘特图开发指南
  2. 工信部召开地方信息安全工作会议
  3. 软件测试实用技术与常用模板:内容提要
  4. 很好的关于机器学习入门讲解(深入浅出)
  5. MES助力中国制药行业 (GMP)
  6. kodi教程 linux,Kodi 设置教程 | Homepage of Zhikun Zhang
  7. 计算机文化基础证书丢了,计算机文化基础 文档的打印与保护 3.8.1 防止文档内容丢失.pptx...
  8. 网格自适应_网格自适应的 2 种方法——实现更高效的计算
  9. linux oracle pam,Linux技术之深入Linux PAM 体系结构(一)
  10. mysql和timescale联合查询_[技术干货] 时序数据库timescaleDB安装