销售网站免费做,软件开发培训费用,wordpress 文章推荐一篇,安徽建设网站公司简介#xff1a; CSDN博客专家#xff0c;专注Android/Linux系统#xff0c;分享多mic语音方案、音视频、编解码等技术#xff0c;与大家一起成长#xff01; 优质专栏#xff1a;Audio工程师进阶系列【原创干货持续更新中……】#x1f680; 人生格言#xff1a; 人生… 简介 CSDN博客专家专注Android/Linux系统分享多mic语音方案、音视频、编解码等技术与大家一起成长 优质专栏Audio工程师进阶系列【原创干货持续更新中……】 人生格言 人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注Android系统攻城狮 1.前言 本篇目的理解Android12之容器类SortedVector、KeyedVector、Vector、VectorImpl之间联系。 2.SortedVector、KeyedVector、Vector、VectorImpl介绍
在Android中SortedVector、KeyedVector、Vector和VectorImpl是用于数据存储和管理的容器类。 SortedVector 原理SortedVector是一个有序容器它基于二进制搜索树Binary Search Tree实现。它会在插入元素时自动维持元素的有序性并提供了一些方法来搜索、插入、删除和访问元素。作用SortedVector可用于需要有序元素管理的场景比如在大量数据中进行快速的查找、插入和删除等操作。 KeyedVector 原理KeyedVector是一种键值对容器它基于哈希表Hash Table实现。每个键由一个哈希函数计算得到一个索引然后将值存储在该索引位置上。在具有相同索引的情况下它会处理冲突并保证键的唯一性。作用KeyedVector可用于需要通过键来访问值的场景比如实现高效的索引、查找和删除操作。 Vector 原理Vector是一个动态数组它可以根据需要动态增加或减少容量。Vector在内部使用数组来存储元素并提供了一些方法用于插入、删除、访问和修改元素。作用Vector可用于需要动态管理大小的数组操作比如在需要经常插入和删除元素的场景中。 VectorImpl 原理VectorImpl是Vector的底层实现它提供了对底层数组的直接访问和操作。它主要用于实现Vector的相关方法。作用VectorImpl在Vector类中作为内部实现的一部分用于提供底层数组的管理和操作功能。
总结
SortedVector和KeyedVector适用于需要对数据进行排序或通过键值对进行访问的场景而Vector适用于需要动态管理数组大小的场景。VectorImpl则是Vector类的底层实现提供对底层数组的直接操作。
3.SortedVector、KeyedVector、Vector、VectorImpl关系类图 #mermaid-svg-hDZieqSKAZcyddyI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hDZieqSKAZcyddyI .error-icon{fill:#552222;}#mermaid-svg-hDZieqSKAZcyddyI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hDZieqSKAZcyddyI .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-hDZieqSKAZcyddyI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hDZieqSKAZcyddyI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hDZieqSKAZcyddyI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hDZieqSKAZcyddyI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hDZieqSKAZcyddyI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hDZieqSKAZcyddyI .marker.cross{stroke:#333333;}#mermaid-svg-hDZieqSKAZcyddyI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hDZieqSKAZcyddyI g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-hDZieqSKAZcyddyI g.classGroup text .title{font-weight:bolder;}#mermaid-svg-hDZieqSKAZcyddyI .nodeLabel,#mermaid-svg-hDZieqSKAZcyddyI .edgeLabel{color:#131300;}#mermaid-svg-hDZieqSKAZcyddyI .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-hDZieqSKAZcyddyI .label text{fill:#131300;}#mermaid-svg-hDZieqSKAZcyddyI .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-hDZieqSKAZcyddyI .classTitle{font-weight:bolder;}#mermaid-svg-hDZieqSKAZcyddyI .node rect,#mermaid-svg-hDZieqSKAZcyddyI .node circle,#mermaid-svg-hDZieqSKAZcyddyI .node ellipse,#mermaid-svg-hDZieqSKAZcyddyI .node polygon,#mermaid-svg-hDZieqSKAZcyddyI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hDZieqSKAZcyddyI .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-hDZieqSKAZcyddyI g.clickable{cursor:pointer;}#mermaid-svg-hDZieqSKAZcyddyI g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-hDZieqSKAZcyddyI g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-hDZieqSKAZcyddyI .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-hDZieqSKAZcyddyI .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-hDZieqSKAZcyddyI .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-hDZieqSKAZcyddyI .dashed-line{stroke-dasharray:3;}#mermaid-svg-hDZieqSKAZcyddyI #compositionStart,#mermaid-svg-hDZieqSKAZcyddyI .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-hDZieqSKAZcyddyI #compositionEnd,#mermaid-svg-hDZieqSKAZcyddyI .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-hDZieqSKAZcyddyI #dependencyStart,#mermaid-svg-hDZieqSKAZcyddyI .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-hDZieqSKAZcyddyI #dependencyStart,#mermaid-svg-hDZieqSKAZcyddyI .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-hDZieqSKAZcyddyI #extensionStart,#mermaid-svg-hDZieqSKAZcyddyI .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-hDZieqSKAZcyddyI #extensionEnd,#mermaid-svg-hDZieqSKAZcyddyI .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-hDZieqSKAZcyddyI #aggregationStart,#mermaid-svg-hDZieqSKAZcyddyI .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-hDZieqSKAZcyddyI #aggregationEnd,#mermaid-svg-hDZieqSKAZcyddyI .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-hDZieqSKAZcyddyI .edgeTerminals{font-size:11px;}#mermaid-svg-hDZieqSKAZcyddyI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 继承 关联友元类 继承 继承 继承 KeyedVector DefaultKeyedVector SortedVector friend class VectorTYPE 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 VectorTYPE;
};templateclass TYPE inline
SortedVectorTYPE::SortedVector(): SortedVectorImpl(sizeof(TYPE),((traitsTYPE::has_trivial_ctor ? HAS_TRIVIAL_CTOR : 0)|(traitsTYPE::has_trivial_dtor ? HAS_TRIVIAL_DTOR : 0)|(traitsTYPE::has_trivial_copy ? HAS_TRIVIAL_COPY : 0)))
{
}templateclass TYPE inline
SortedVectorTYPE::SortedVector(const SortedVectorTYPE rhs): SortedVectorImpl(rhs) {
}templateclass TYPE inline
SortedVectorTYPE::~SortedVector() {finish_vector();
}templateclass TYPE inline
SortedVectorTYPE SortedVectorTYPE::operator (const SortedVectorTYPE rhs) {SortedVectorImpl::operator (rhs);return *this;
}templateclass TYPE inline
const SortedVectorTYPE SortedVectorTYPE::operator (const SortedVectorTYPE 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 KeyedVectorKEY, VALUE
{
public:inline DefaultKeyedVector(const VALUE defValue VALUE());const VALUE valueFor(const KEY key) const;private:VALUE mDefault;
};// ---------------------------------------------------------------------------templatetypename KEY, typename VALUE inline
KeyedVectorKEY,VALUE::KeyedVector()
{
}templatetypename KEY, typename VALUE inline
bool KeyedVectorKEY,VALUE::isIdenticalTo(const KeyedVectorKEY,VALUE rhs) const {return mVector.array() rhs.mVector.array();
}templatetypename KEY, typename VALUE inline
ssize_t KeyedVectorKEY,VALUE::indexOfKey(const KEY key) const {return mVector.indexOf( key_value_pair_tKEY,VALUE(key) );
}templatetypename KEY, typename VALUE inline
const VALUE KeyedVectorKEY,VALUE::valueFor(const KEY key) const {ssize_t i this-indexOfKey(key);LOG_ALWAYS_FATAL_IF(i0, %s: key not found, __PRETTY_FUNCTION__);return mVector.itemAt(i).value;
}templatetypename KEY, typename VALUE inline
const VALUE KeyedVectorKEY,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 VectorTYPE rhs);explicit Vector(const SortedVectorTYPE rhs);virtual ~Vector();/*! copy operator */const VectorTYPE operator (const VectorTYPE rhs) const;VectorTYPE operator (const VectorTYPE rhs);const VectorTYPE operator (const SortedVectorTYPE rhs) const;VectorTYPE operator (const SortedVectorTYPE rhs);/** empty the vector*/};templateclass TYPE inline
VectorTYPE::Vector(): VectorImpl(sizeof(TYPE),((traitsTYPE::has_trivial_ctor ? HAS_TRIVIAL_CTOR : 0)|(traitsTYPE::has_trivial_dtor ? HAS_TRIVIAL_DTOR : 0)|(traitsTYPE::has_trivial_copy ? HAS_TRIVIAL_COPY : 0)))
{
}templateclass TYPE inline
VectorTYPE::Vector(const VectorTYPE rhs): VectorImpl(rhs) {
}templateclass TYPE inline
VectorTYPE::Vector(const SortedVectorTYPE rhs): VectorImpl(static_castconst VectorImpl(rhs)) {
}templateclass TYPE inline
VectorTYPE::~Vector() {finish_vector();
}templateclass TYPE inline
VectorTYPE VectorTYPE::operator (const VectorTYPE rhs) {VectorImpl::operator (rhs);return *this;
}