Android12之容器类SortedVector、KeyedVector、Vector、VectorImpl总结(一百六十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解Android12之容器类SortedVector、KeyedVector、Vector、VectorImpl之间联系。

2.SortedVector、KeyedVector、Vector、VectorImpl介绍

在Android中,SortedVector、KeyedVector、Vector和VectorImpl是用于数据存储和管理的容器类。

  1. SortedVector:

    • 原理:SortedVector是一个有序容器,它基于二进制搜索树(Binary Search Tree)实现。它会在插入元素时自动维持元素的有序性,并提供了一些方法来搜索、插入、删除和访问元素。
    • 作用:SortedVector可用于需要有序元素管理的场景,比如在大量数据中进行快速的查找、插入和删除等操作。
  2. KeyedVector:

    • 原理:KeyedVector是一种键值对容器,它基于哈希表(Hash Table)实现。每个键由一个哈希函数计算得到一个索引,然后将值存储在该索引位置上。在具有相同索引的情况下,它会处理冲突并保证键的唯一性。
    • 作用:KeyedVector可用于需要通过键来访问值的场景,比如实现高效的索引、查找和删除操作。
  3. Vector:

    • 原理:Vector是一个动态数组,它可以根据需要动态增加或减少容量。Vector在内部使用数组来存储元素,并提供了一些方法用于插入、删除、访问和修改元素。
    • 作用:Vector可用于需要动态管理大小的数组操作,比如在需要经常插入和删除元素的场景中。
  4. VectorImpl:

    • 原理:VectorImpl是Vector的底层实现,它提供了对底层数组的直接访问和操作。它主要用于实现Vector的相关方法。
    • 作用:VectorImpl在Vector类中作为内部实现的一部分,用于提供底层数组的管理和操作功能。

总结:

  • SortedVector和KeyedVector适用于需要对数据进行排序或通过键值对进行访问的场景,
  • 而Vector适用于需要动态管理数组大小的场景。
  • VectorImpl则是Vector类的底层实现,提供对底层数组的直接操作。

3.SortedVector、KeyedVector、Vector、VectorImpl关系类图

继承
关联友元类
继承
继承
继承
KeyedVector
DefaultKeyedVector
SortedVector
friend class Vector<TYPE>
SortedVectorImpl
VectorImpl
Vector
typedef TYPE value_type

4.SortedVector、KeyedVector、Vector、VectorImpl实现

<1>.VectorImpl定义

system/core/libutils/include/utils/VectorImpl.h

class VectorImpl
{
/*! C-style array access */inline  const void*     arrayImpl() const       { return mStorage; }void*           editArrayImpl();/*! vector stats */inline  size_t          size() const        { return mCount; }inline  bool            isEmpty() const     { return mCount == 0; }size_t          capacity() const;ssize_t         setCapacity(size_t size);ssize_t         resize(size_t size);/*! append/insert another vector or array */ssize_t         insertVectorAt(const VectorImpl& vector, size_t index);ssize_t         appendVector(const VectorImpl& vector);ssize_t         insertArrayAt(const void* array, size_t index, size_t length);ssize_t         appendArray(const void* array, size_t length);/*! add/insert/replace items */ssize_t         insertAt(size_t where, size_t numItems = 1);ssize_t         insertAt(const void* item, size_t where, size_t numItems = 1);void            pop();void            push();void            push(const void* item);ssize_t         add();ssize_t         add(const void* item);ssize_t         replaceAt(size_t index);ssize_t         replaceAt(const void* item, size_t index);class SortedVectorImpl : public VectorImpl
{public:SortedVectorImpl(size_t itemSize, uint32_t flags);explicit                SortedVectorImpl(const VectorImpl& rhs);virtual                 ~SortedVectorImpl();SortedVectorImpl&     operator = (const SortedVectorImpl& rhs);    //! finds the index of an itemssize_t         indexOf(const void* item) const;//! finds where this item should be insertedsize_t          orderOf(const void* item) const;//! add an item in the right place (or replaces it if there is one)ssize_t         add(const void* item);//! merges a vector into this onessize_t         merge(const VectorImpl& vector);
};
};

<2>.VectorImpl实现

system/core/libutils/VectorImpl.cpp

VectorImpl::VectorImpl(size_t itemSize, uint32_t flags): mStorage(nullptr), mCount(0), mFlags(flags), mItemSize(itemSize)
{
}VectorImpl::VectorImpl(const VectorImpl& rhs):   mStorage(rhs.mStorage), mCount(rhs.mCount),mFlags(rhs.mFlags), mItemSize(rhs.mItemSize)
{if (mStorage) {SharedBuffer::bufferFromData(mStorage)->acquire();}
}

<3>.SortedVector定义与实现

system/core/libutils/include/utils/SortedVector.h

template <class TYPE>
class SortedVector : private SortedVectorImpl
{friend class Vector<TYPE>;
};template<class TYPE> inline
SortedVector<TYPE>::SortedVector(): SortedVectorImpl(sizeof(TYPE),((traits<TYPE>::has_trivial_ctor   ? HAS_TRIVIAL_CTOR   : 0)|(traits<TYPE>::has_trivial_dtor   ? HAS_TRIVIAL_DTOR   : 0)|(traits<TYPE>::has_trivial_copy   ? HAS_TRIVIAL_COPY   : 0)))
{
}template<class TYPE> inline
SortedVector<TYPE>::SortedVector(const SortedVector<TYPE>& rhs): SortedVectorImpl(rhs) {
}template<class TYPE> inline
SortedVector<TYPE>::~SortedVector() {finish_vector();
}template<class TYPE> inline
SortedVector<TYPE>& SortedVector<TYPE>::operator = (const SortedVector<TYPE>& rhs) {SortedVectorImpl::operator = (rhs);return *this;
}template<class TYPE> inline
const SortedVector<TYPE>& SortedVector<TYPE>::operator = (const SortedVector<TYPE>& rhs) const {SortedVectorImpl::operator = (rhs);return *this;
}

<4>.KeyedVector定义与实现

system/core/libutils/include/utils/KeyedVector.h

template <typename KEY, typename VALUE>
class KeyedVector
{
public:typedef KEY    key_type;typedef VALUE  value_type;inline                  KeyedVector();
};template <typename KEY, typename VALUE>
class DefaultKeyedVector : public KeyedVector<KEY, VALUE>
{
public:inline                  DefaultKeyedVector(const VALUE& defValue = VALUE());const VALUE&    valueFor(const KEY& key) const;private:VALUE                                           mDefault;
};// ---------------------------------------------------------------------------template<typename KEY, typename VALUE> inline
KeyedVector<KEY,VALUE>::KeyedVector()
{
}template<typename KEY, typename VALUE> inline
bool KeyedVector<KEY,VALUE>::isIdenticalTo(const KeyedVector<KEY,VALUE>& rhs) const {return mVector.array() == rhs.mVector.array();
}template<typename KEY, typename VALUE> inline
ssize_t KeyedVector<KEY,VALUE>::indexOfKey(const KEY& key) const {return mVector.indexOf( key_value_pair_t<KEY,VALUE>(key) );
}template<typename KEY, typename VALUE> inline
const VALUE& KeyedVector<KEY,VALUE>::valueFor(const KEY& key) const {ssize_t i = this->indexOfKey(key);LOG_ALWAYS_FATAL_IF(i<0, "%s: key not found", __PRETTY_FUNCTION__);return mVector.itemAt(i).value;
}template<typename KEY, typename VALUE> inline
const VALUE& KeyedVector<KEY,VALUE>::valueAt(size_t index) const {return mVector.itemAt(index).value;
}

<5>.Vector定义与实现

system/core/libutils/include/utils/Vector.h

template <class TYPE>
class Vector : private VectorImpl
{
public:typedef TYPE    value_type;/*!* Constructors and destructors*/Vector();Vector(const Vector<TYPE>& rhs);explicit                Vector(const SortedVector<TYPE>& rhs);virtual                 ~Vector();/*! copy operator */const Vector<TYPE>&     operator = (const Vector<TYPE>& rhs) const;Vector<TYPE>&           operator = (const Vector<TYPE>& rhs);const Vector<TYPE>&     operator = (const SortedVector<TYPE>& rhs) const;Vector<TYPE>&           operator = (const SortedVector<TYPE>& rhs);/** empty the vector*/};template<class TYPE> inline
Vector<TYPE>::Vector(): VectorImpl(sizeof(TYPE),((traits<TYPE>::has_trivial_ctor   ? HAS_TRIVIAL_CTOR   : 0)|(traits<TYPE>::has_trivial_dtor   ? HAS_TRIVIAL_DTOR   : 0)|(traits<TYPE>::has_trivial_copy   ? HAS_TRIVIAL_COPY   : 0)))
{
}template<class TYPE> inline
Vector<TYPE>::Vector(const Vector<TYPE>& rhs): VectorImpl(rhs) {
}template<class TYPE> inline
Vector<TYPE>::Vector(const SortedVector<TYPE>& rhs): VectorImpl(static_cast<const VectorImpl&>(rhs)) {
}template<class TYPE> inline
Vector<TYPE>::~Vector() {finish_vector();
}template<class TYPE> inline
Vector<TYPE>& Vector<TYPE>::operator = (const Vector<TYPE>& rhs) {VectorImpl::operator = (rhs);return *this;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/87263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「大数据-2.1」HDFS集群启停命令

目录 一、HDFS集群一键启停脚本 1. HDFS集群的一键启动脚本 2. HDFS集群的一键关闭脚本 二、单进程启停 1. hadoop-daemon.sh脚本 2. hdfs脚本 三、总结 1. 一键启停脚本 2. 独立进程启停 一、HDFS集群一键启停脚本 Hadoop HDFS组件内置了HDFS集群的一键启停脚本。 1. HDFS集群…

ubuntu20.04 jammy 安装ros2

ubunut22.04 jammy&#xff08;5.15&#xff09; ros2版本: humble 安装参考&#xff1a; Ubuntu (Debian packages) — ROS 2 Documentation: Humble documentationl 按照官方给的操作指南进行操作即可&#xff0c;到安装软件包的时候&#xff0c;若只为开发&#xff0…

【LeetCode热题100】--56.合并区间

56.合并区间 排序&#xff1a; 如果按照区间的左端点排序&#xff0c;那么在排完序的列表中&#xff0c;可以合并的区间一定是连续的&#xff0c;如下图所示&#xff0c;标记为蓝色、黄色和绿色的区间分别可以合并为一个大区间&#xff0c;它们在排完序的列表中是连续的 算法&a…

安科瑞AMC16-DETT铁塔jizhan直流电能计量模块,直流计量用

安科瑞虞佳豪壹捌柒陆壹伍玖玖零玖叁 9月20日&#xff0c;在杭州亚运会火炬传递的现场&#xff0c;不少人通过网络与亲友连线&#xff0c;共同见证火炬传递的历史时刻。上午6时&#xff0c;杭州铁塔的一线通信保障人员共27人就已经在本次火炬传递收官点位奥体中心西广场附近&a…

【操作系统笔记九】并发安全问题

用户态抢占和内核态抢占 内核中可以执行以下几种程序&#xff1a; ① 当前运行的进程&#xff1a;陷阱程序&#xff08;系统调用&#xff09; 和 故障程序&#xff08;page fault&#xff09; &#xff0c;进程运行在内核态的时候&#xff0c;其实就是在执行进程在用户态触发的…

关于安卓SVGA浅尝(一)svgaplayer库的使用

关于安卓SVGA浅尝&#xff08;一&#xff09;使用 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发&#xff0c;都会和动画打交道&#xff0c;动画的方案选取&#xff0c;就有很多选择。如Json动画&#xff0c;svga动画&#xff0c;gif等等。各有各的优势。目前项目中…

【PCIE702-1】基于Kintex UltraScale系列FPGA的高性能PCIe总线数据预处理载板

PCIE702-1是一款基于PCIE总线架构的高性能数据预处理FMC载板&#xff0c;板卡采用Xilinx的高性能Kintex UltraScale系列FPGA作为实时处理器&#xff0c;实现各个接口之间的互联。板卡具有1个FMC&#xff08;HPC&#xff09;接口&#xff0c;1路PCIe x8主机接口&#xff0c;板载…

AxureRP制作静态站点发布互联网,实现公网访问【内网穿透】

AxureRP制作静态站点发布互联网&#xff0c;内网穿透实现公网访问 文章目录 AxureRP制作静态站点发布互联网&#xff0c;内网穿透实现公网访问前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4…

【实战项目之个人博客】

目录 项目背景 项目技术栈 项目介绍 项目亮点 项目启动 1.创建SSM&#xff08;省略&#xff09; 2.配置项目信息 3.将前端页面加入到项目中 4.初始化数据库 5.创建标准分层的目录 6.创建和编写项目中的公共代码以及常用配置 7.创建和编写业务的Entity、Mapper、…

认识HTTP和HTTPS协议

HTTPS 是什么 HTTPS 也是一个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层. 为什么要引入加密层呢&#xff1f; HTTP 协议内容都是按照文本的方式明文传输的. 这就导致在传输过程中出现一些被篡改的情况. HTTPS就是在HTTP的基础上进行了加密&#xff0c;进一步的保…

Qt QCustomPlot介绍

介绍 主要介绍qcustomplot及其用法 最新版本:QCustomPlot Patch Release 2.1.1//November 6, 2022 下载:https://www.qcustomplot.com/index.php/download 官网:https://www.qcustomplot.com/index.php 简单使用 mainwindow.h /**************************************…

2023年8月京东洗烘套装行业品牌销售排行榜(京东数据开放平台)

鲸参谋监测的京东平台8月份洗烘套装市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;今年8月份&#xff0c;京东平台洗烘套装的销量为1.1万&#xff0c;同比增长约218%&#xff1b;销售额约为1.2亿&#xff0c;同比增长约279%。可以看到&#xff0c;洗烘…

清华用7个ChatGPT模拟《狼人杀》,结果出乎意料!

为了验证大语言模型的沟通、规划、反思等拟人化能力&#xff0c;清华研究团队发布了一篇名为“探索大语言模型在交流游戏中的应用&#xff1a;《狼人杀》实验”的研究论文。 结果显示&#xff0c;通过ChatGPT&#xff08;GPT -turbo-0301&#xff09;构建的7个玩家&#xff0c…

HEC-RAS 1D/2D水动力与水环境模拟从小白到精通

专题一 水动力模型基础 1.水动力模型的本质 2.水动力模型的基本方程与适用范围 3.模型建模要点 4.注意事项与建模经验 专题二 恒定流模型(1D/2D) 1.恒定流及其适用范围 2.水面线分析及其数据要求 3.曼宁公式与恒定流&#xff0c;后处理 4.HEC-RA的水工建筑物&#xff…

【计算机网络】IP协议第二讲(Mac帧、IP地址、碰撞检测、ARP协议介绍)

IP协议第二讲 1.IP和Mac帧2.碰撞检测2.1介绍2.2如何减少碰撞发生2.3MTU2.4一些补充 3.ARP协议3.1协议介绍3.2报文格式分析 1.IP和Mac帧 IP&#xff08;Internet Protocol&#xff09;和MAC&#xff08;Media Access Control&#xff09;帧是计算机网络中两个不同层次的概念&am…

Swift SwiftUI 隐藏键盘

如果仅支持 iOS 15 及更高版本&#xff0c;则可以通过聚焦和取消聚焦来激活和关闭文本字段的键盘。 在最简单的形式中&#xff0c;这是使用 FocusState 属性包装器和 focusable() 修饰符完成的-第一个存储一个布尔值&#xff0c;用于跟踪第二个当前是否被聚焦。 Code struct C…

视频直播美颜sdk与计算机视觉的奇妙结合

在数字时代&#xff0c;视频直播已经成为了人们分享生活、娱乐互动的重要方式之一。而随着社交媒体和在线直播平台的不断发展&#xff0c;用户们对于直播质量和体验提出了越来越高的要求。其中之一就是美颜效果。美颜不仅仅是为了矫正自身缺陷&#xff0c;它更是一种增强直播吸…

牛客练习赛116

(0条未读通知) 牛客练习赛116_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com) A.等差数列 对于此题可以分为两类&#xff1a; 1.当k 0&#xff0c;此时A1,A2...值都为a 2.当k ! 0,此时又分为两大类&#xff1a; 1.平局&#xff08;发现A1,A2,A3等连…

Automation Anywhere推出新的生成式AI自动化平台,加速提高企业生产力

在9 月 19 日的Imagine 2023 大会上&#xff0c;智能自动化领域的领导者 Automation Anywhere 宣布对其自动化平台进行扩展。推出了新的 Responsible AI Layer&#xff0c;并宣布了四项关键产品更新&#xff0c;包括全新的 Autopilot&#xff0c;它可以利用生成式 AI &#xff…

堆的介绍与堆的实现和调整

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 ​​堆的介绍&#xff1a; 关于堆的实现及相关的其他问题&#xff1a; 堆的初始化&#xff1a; 堆的销毁&#xff1a; 插入建堆&#xff1a; 堆向上调整&#xff1a; 交换两个节点的值&#xff1a; 堆向下调整&a…