色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

鏈表的替代品Vector組件介紹

jf_NsPBt3VS ? 來源:風火輪技術團隊 ? 2023-03-07 10:41 ? 次閱讀

概述

在之前的一篇文章中,作者寫了一個事件組件-- 超精簡的訂閱發(fā)布事件組件--SPEvent,這個組件是采用鏈表建立所有事件節(jié)點的關系的。

鏈表的優(yōu)缺點:

優(yōu)點:①鏈表上的元素在空間存儲上內(nèi)存地址不連續(xù);②在插入和刪除操作時,只需要修改被刪節(jié)點上一節(jié)點的鏈接地址,不需要移動元素;

缺點:①沒有解決連續(xù)存儲分配帶來的表長難以確定的問題;②失去了順序存儲結(jié)構(gòu)隨機存取的特性;③不能通過數(shù)學表達式計算被查找元素的內(nèi)存地址,每一次查找都是從頭節(jié)點開始遍歷,直到找到為止。

SPEvent實際不會存在刪改的動作,顯然鏈表的優(yōu)點在這個組件中無法體現(xiàn)優(yōu)勢。而實際順利存儲更能滿足SPEvent的業(yè)務及能力,那么有什么方式能做到這個操作了?答案肯定是有的,有一個好組件(Vector)正好可以解決掉這個問題。

Vector組件--向量;這個名稱一點也不陌生,比如我們單片機開發(fā)中常常聽到中斷向量表,它是通過地址查找對應中斷服務函數(shù);而Vector組件也有點類似這個概念,它可以通過名稱、類型查找對象。

Vector組件的優(yōu)勢可以應用像SPEvent這類組件中,如:SPEvent就可以通過Event類型去查找事件節(jié)點。那么Vector是怎么實現(xiàn)的??

Vector組件

Vector組件--它是類似于鏈表擁有的能力,是一種動態(tài)數(shù)組存儲組件,Vector組件擁有的能力如下:

提供了順序存儲的能力,并且能夠動態(tài)增大順序存儲空間;

提供了增加對象能力,查找對象能力。

提供獲取順序存儲空間能力,獲取對象個數(shù)能力。

采用KEY-VALUE的特性開查找對象。

Vector接口說明:

接口 描述
Vector VECTOR_Make(VECTOR_Key key, VECTOR_Compare compare) 創(chuàng)建Vector列表對象,用戶根據(jù)業(yè)務注冊VECTOR_Key方法和VECTOR_Compare方法
void VECTOR_Clear(Vector *vector) 清空Vector列表對象,并釋放存儲數(shù)據(jù)空間
int16_t VECTOR_Add(Vector *vector, void *element) 添加元素到Vector列表對象
int16_t VECTOR_Size(Vector *vector) 獲取Vector列表對象的元素個數(shù)
int16_t VECTOR_Num(Vector *vector) 獲取Vector列表對象的元素記錄數(shù)目
void *VECTOR_At(Vector *vector, int16_t index) 根據(jù)下標獲取Vector列表對象的元素
void *VECTOR_Swap(Vector *vector, int16_t index, void *element) 替換指定下標的Vector列表對象的元素
int16_t VECTOR_Find(Vector *vector, const void *element) 通過元素從Vector列表對象中查找對應下標
int16_t VECTOR_FindByKey(Vector *vector, const void *key) 通過鍵從Vector列表對象中查找對應下標

Vector實現(xiàn):

數(shù)據(jù)結(jié)構(gòu):每一個存儲列表都需要構(gòu)造一個Vector結(jié)構(gòu)體對象,用于存儲元素對象。

//vector.h
#defineGROW_STEP4

#defineINVALID_INDEX(-1)
typedefvoid*(*VECTOR_Key)(constvoid*);//應用層提供KEY-VALUE獲取方法,泛類型
typedefint(*VECTOR_Compare)(constvoid*,constvoid*);//應用層提供比較函數(shù),泛類型

typedefstructSimpleVector{
int16_tmax;//vector所能存儲的最大數(shù)據(jù)記錄數(shù)目
int16_ttop;//vector當前已經(jīng)存儲的數(shù)據(jù)的峰值數(shù)目
int16_tfree;//vector已經(jīng)被釋放的數(shù)據(jù)記錄數(shù)目
void**data;//vector存儲數(shù)據(jù)指針
VECTOR_Keykey;//將數(shù)據(jù)元素轉(zhuǎn)換為用于比較的鍵。方法由用戶提供
VECTOR_Comparecompare;//將用于比較鍵值。方法由用戶提供
}Vector;

Vector列表對象構(gòu)造方法:其中max,top,free初始狀態(tài)都為0。

VectorVECTOR_Make(VECTOR_Keykey,VECTOR_Comparecompare)
{
Vectorvector={0,0,0,NULL,key,compare};
returnvector;
}

Vector列表對象清除方法:將Vector列表對象的數(shù)據(jù)元素空間釋放,并將max,top,free清0。

voidVECTOR_Clear(Vector*vector)
{
if(vector==NULL){
return;
}
if(vector->data==NULL){
return;
}
free(vector->data);
vector->max=0;
vector->top=0;
vector->free=0;
vector->data=NULL;
}

Vector列表對象增加元素方法:

存儲方式:采用順序存儲方式

存儲空間擴展策略:通過GROW_STEP的來決定沒存儲多少個元素來動態(tài)擴展空間;描述:如GROW_STEP的值為4,每次申請4個空間進行存儲,如果存儲元素個數(shù)小于4個,不會重新申請空間;如果元素個數(shù)個數(shù)超過4個,那么將重新申請4個空間。以此類推。優(yōu)點:減少每次增加元素都要重新申請空間,提高了效率。

int16_tVECTOR_Add(Vector*vector,void*element)
{
if(vector==NULL||element==NULL){
returnINVALID_INDEX;
}

if(vector->top>=vector->max){
int16_ti;
for(i=vector->top-(int16_t)1;i>=0;--i){
if(vector->data[i]==NULL){
vector->data[i]=element;
vector->free--;
returni;
}
}

if(vector->max+GROW_STEPmax+GROW_STEP));
if(data==NULL){
returnINVALID_INDEX;
}

if(vector->data!=NULL){
(void)memcpy(data,vector->data,sizeof(void*)*vector->max);
free(vector->data);
}
vector->data=data;
vector->max+=GROW_STEP;
}

vector->data[vector->top]=element;
returnvector->top++;
}

Vector列表對象根據(jù)下標過去對象方法:Vector可以直接通過順序表的策略,直接通過下標獲取元素;相對于鏈表來說,效率更加有優(yōu)勢。

void*VECTOR_At(Vector*vector,int16_tindex)
{
if(vector==NULL||vector->top<=?index?||?index?data[index];
}

Vector列表對象根據(jù)下標替換對象方法:Vector可以直接通過順序表的策略,直接通過下標修改元素;相對于鏈表來說,效率更加有優(yōu)勢。

void*VECTOR_Swap(Vector*vector,int16_tindex,void*element)
{
if(vector==NULL||vector->top<=?index?||?index?free++;
}
void*oldElement=vector->data[index];
vector->data[index]=element;
returnoldElement;
}

Vector列表對象根據(jù)元素查找對應下標方法:最終也是調(diào)用VECTOR_FindByKey方法。

int16_tVECTOR_Find(Vector*vector,constvoid*element)
{
if(vector==NULL||element==NULL){
returnINVALID_INDEX;
}
returnVECTOR_FindByKey(vector,(vector->key==NULL)?element:vector->key(element));
}

Vector列表對象根據(jù)鍵查找對應下標方法:遍歷整個Vector列表,查詢對應的key值,并返回對應下邊。

int16_tVECTOR_FindByKey(Vector*vector,constvoid*key)
{
if(vector==NULL||key==NULL){
returnINVALID_INDEX;
}

int16_ti;
for(i=0;itop;++i){
if(vector->data[i]==NULL){
continue;
}

void*first=(vector->key!=NULL)?vector->key(vector->data[i]):vector->data[i];
if(first==key){
returni;
}

if(vector->compare==NULL||first==NULL){
continue;
}

if(vector->compare(first,key)==0){
returni;
}
}
returnINVALID_INDEX;
}

Vector列表對象中元素個數(shù)獲取方法:

int16_tVECTOR_Size(Vector*vector)
{
if(vector==NULL){
returnINVALID_INDEX;
}
returnvector->top;
}

Vector列表對象中元素記錄數(shù)目獲取方法:

int16_tVECTOR_Num(Vector*vector)
{
if(vector==NULL){
returnINVALID_INDEX;
}
returnvector->top-vector->free;
}

Vector使用:

定義一個元素結(jié)構(gòu)體(vector_test),包含兩個字段:name和data,其中name可以作為元素對象的唯一標識。

定義兩個vector_test變量,youyeetoo1和youyeetoo2。

我們這個demo是采用name作為唯一標識,需要頂一個函數(shù)用于獲取vector_test變量的name字段成員的值,作為VECTOR_Key指向函數(shù)。

通過VECTOR_Make構(gòu)造一個vector對象。其中VECTOR_Key指向vector_name_get函數(shù)作為key獲取,VECTOR_Compare指向strcmp函數(shù)用于key(name字符串)的比較。

通過VECTOR_Add向vector對象增加元素youyeetoo1和youyeetoo2。

通過VECTOR_FindByKey從vector對象查找元素對象下標。如:key為"rice"的元素對象下標。

通過VECTOR_FindByKey獲取的pos,調(diào)用VECTOR_At獲取元素對象。

驗證:根據(jù)獲取元素對象調(diào)用其成員,確定是否成功。

#include"vector.h"

Vectoryouyeetoo_vector;

typedefstruct{
char*name;
intdata;
}vector_test;

vector_testyouyeetoo1={"rice",100};
vector_testyouyeetoo2={"youyeetoo",100};

constchar*vector_name_get(vector_test*test)
{
returntest->name;
}

intmain(void)
{
youyeetoo_vector=VECTOR_Make(vector_name_get,strcmp);

VECTOR_Add(&youyeetoo_vector,&youyeetoo1);
VECTOR_Add(&youyeetoo_vector,&youyeetoo2);

int16_tpos=VECTOR_FindByKey(&youyeetoo_vector,"rice");

printf("pos:%d
",pos);

vector_test*youyeetoo_temp=VECTOR_At(&youyeetoo_vector,pos);

printf("name:%s
",youyeetoo_temp->name);

returnRT_EOK;
}

結(jié)果:

7a1d8d6e-bc66-11ed-bfe3-dac502259ad0.png






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • SPE
    SPE
    +關注

    關注

    0

    文章

    27

    瀏覽量

    13739
  • 數(shù)據(jù)鏈表

    關注

    0

    文章

    3

    瀏覽量

    2461
  • Vector
    +關注

    關注

    3

    文章

    60

    瀏覽量

    8599

原文標題:鏈表的替代品--Vector組件

文章出處:【微信號:風火輪技術團隊,微信公眾號:風火輪技術團隊】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    LM3080N的替代品有哪些?

    有這個芯片LM3080N的替代品沒? 幫人詢問呢。謝謝。
    發(fā)表于 09-14 08:46

    尋找松下TX2-12V的替代品

    松下的效益不行了,要搬場,繼電器要漲價,求替代品。哪位大俠可以幫助一下。謝謝。原來用的型號是TX2-12V。附件中是他的數(shù)據(jù)手冊。
    發(fā)表于 11-17 11:42

    尋求Ubuntu13系統(tǒng)下軟件替代品……

    下的kile軟件的替代品是什么?我在ubuntu軟件中心找到了一個kile,但是安裝后總感覺什么都沒有,模板也找不到,完全不會用,球大神給講解下……還有,Visual Studio的替代品,做fpga
    發(fā)表于 10-26 10:06

    MMBFJ176替代品??

    如題,需要尋找一個MMBFJ176替代品,用于保證電化學檢測器在斷電的情況下兩端電位不會偏差太大。附件為MMBFJ176規(guī)格書,望大神回復下,謝謝!
    發(fā)表于 07-21 08:33

    請問儀表放大器AD624有沒有便宜的完全兼容的替代品

    儀表放大器AD624有沒有便宜的完全兼容的替代品?市場上這個芯片有點貴,還不太好買到,想找兼容替代品,性能稍低點也可以,能滿足要求就行,求大神推薦,謝謝。
    發(fā)表于 01-23 09:27

    是否有TDA2003的替代品

    是否有TDA2003的替代品,或者任何人都可以推薦類似的音頻放大器,可以驅(qū)動低至1歐姆的負載? #TDA2003
    發(fā)表于 08-05 10:19

    如何使用ISP1763作為替代品

    已經(jīng)過時,ST-Ericson提供的下一個系列是ISP1763。 ISP1760采用128引腳配置,具有16地址線和32數(shù)據(jù)線。但新的ISP1763只是64引腳,有8個地址和32個數(shù)據(jù)引腳。我們?nèi)绾问褂肐SP1763作為替代品?這有什么替代方案嗎?-謝謝
    發(fā)表于 09-04 07:00

    Commodore 6540 ROM的替代品

    的 6540 ROM 芯片組的直接替代品。我發(fā)現(xiàn) D'Asaro 項目非常好且緊湊,但更難構(gòu)建。此外,他僅以 PCBexpress 格式發(fā)布該項目,無法將其導出到 Gerber。由于
    發(fā)表于 09-02 07:26

    MC908JL3ECDWE的替代品是什么?

    。 您能否介紹它的任何變體或合適的替代品? 如果沒有任何 28 腳 8 位 MCU 替換,請?zhí)峁┳钕嗨频牟糠帧?/div>
    發(fā)表于 06-05 06:17

    鈷鎳錳(三元)正極材料---鈷酸鋰的理想替代品

    鈷鎳錳(三元)正極材料---鈷酸鋰的理想替代品  鈷鎳錳(三元)正極材料---鈷酸鋰的理想替代品 產(chǎn)品特點
    發(fā)表于 10-29 11:59 ?2177次閱讀

    最佳 CPU 導熱膏替代品替代品

    CPU導熱膏之于裝配工和電腦維修工,線程之于時裝設計師。這強調(diào)了這種維修工具的重要性,以及為什么必須有足夠的供應來加強他們的工作。但是,當意外發(fā)生時,有可用的替代品,可以守住堡壘。 很多時候,組裝商
    的頭像 發(fā)表于 07-27 16:10 ?6715次閱讀
    最佳 CPU 導熱膏<b class='flag-5'>替代品</b>和<b class='flag-5'>替代品</b>

    變速泵的更好電機替代品

    變速泵的更好電機替代品(視頻)
    的頭像 發(fā)表于 03-13 17:02 ?786次閱讀
    變速泵的更好電機<b class='flag-5'>替代品</b>

    鏈表替代品--Vector組件

    概述 在之前的一篇文章中,作者寫了一個事件組件-- 超精簡的訂閱發(fā)布事件組件--SPEvent ,這個組件是采用鏈表建立所有事件節(jié)點的關系的。 鏈表
    的頭像 發(fā)表于 04-06 15:39 ?531次閱讀

    CFP – SMx封裝的高效替代品

    CFP – SMx封裝的高效替代品
    的頭像 發(fā)表于 12-05 10:58 ?694次閱讀
    CFP – SMx封裝的高效<b class='flag-5'>替代品</b>

    替代品牌型號介紹

    電子發(fā)燒友網(wǎng)站提供《可替代品牌型號介紹.xlsx》資料免費下載
    發(fā)表于 12-14 10:49 ?7次下載
    主站蜘蛛池模板: 伊在香蕉国产在线视频| 久久久久久久伊人电影| 中文字幕国产视频| 同时被两个男人轮流舔| 免费黄色网址在线观看| 国产亚洲精品久久久久久禁果TV| 99久久免费热在线精品| 亚洲日产2020乱码草莓毕| 日韩欧美一级| 欧美手机在线| 麻豆精品乱码WWW久久密| 精品久久久久久久国产潘金莲| 高清不卡伦理电影在线观看| 99热久久这里只精品国产WWW| 亚洲精品成人无码A片在线| 日日操日日射| 亚洲精品福利一区二区在线观看| 在线 中文字幕| 在线亚洲精品福利网址导航| av色天堂2018在线观看| 国产精品无码久久av| 国产成人免费手机在线观看视频| chinesevideoshd性舞| 5g在视影讯天天5g免费观看| 在线观看免费视频播放视频| zxfuli午夜福利在线| 扒开老师大腿猛进AAA片软件| 国产精品一久久香蕉国产线看| 久久天堂视频| 乐乐亚洲精品综合影院| 美女伊人网| 女攻男受高h全文肉肉| 欧美午夜不卡在线观看| 欧美日韩亚洲第一区在线| 无限资源日本2019版| 天天靠天天擦天天摸| 在线视频免费观看| 国产精品18久久久久久欧美| 国产高清-国产av| 麻豆区蜜芽区| 亚洲精品m在线观看|