最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言實(shí)現(xiàn)切片數(shù)組的示例詳解

 更新時(shí)間:2024年03月25日 08:52:12   作者:CodeOfCC  
由于c語(yǔ)言沒有集合類的標(biāo)準(zhǔn)庫(kù),需要用時(shí)只能自己實(shí)現(xiàn),所以本文參考了go語(yǔ)言的slice,找到了一種非常簡(jiǎn)化的動(dòng)態(tài)數(shù)組接口,下面我們就來看看如何在C語(yǔ)言中實(shí)現(xiàn)切片吧

前言

由于c語(yǔ)言沒有集合類的標(biāo)準(zhǔn)庫(kù),需要用時(shí)只能自己實(shí)現(xiàn),由于c語(yǔ)言沒有泛型,使得實(shí)現(xiàn)的集合類接口通常比較另類,很多時(shí)候都需要二級(jí)指針作為參數(shù),且不支持字面量作為參數(shù),使用時(shí)心智負(fù)擔(dān)較重。本文參考go語(yǔ)言的slice,找到了一種非常簡(jiǎn)化的動(dòng)態(tài)數(shù)組接口,可以極大的方便使用。

一、接口定義

1、創(chuàng)建切片

指定元素類型,以及容量即可以創(chuàng)建切片,返回是一個(gè)數(shù)組

/// <summary>
/// 創(chuàng)建切片
/// </summary>
/// <param name="t">元素類型</param>
/// <param name="cap">切片容量</param>
/// <returns>切片數(shù)組</returns>
#define make(t,cap)

2、銷毀切片

與go語(yǔ)言不同,c語(yǔ)言需要管理內(nèi)存。用完后的切片需要銷毀。

/// <summary>
/// 銷毀切片
/// </summary>
/// <param name="a">切片數(shù)組</param>
#define unmake(a)

3、添加元素

可以添加元素也可以添加數(shù)組,數(shù)組長(zhǎng)度會(huì)自動(dòng)增長(zhǎng)。

/// <summary>
/// 添加元素、數(shù)組
/// </summary>
/// <param name="a">切片數(shù)組</param>
/// <param name="e">元素、數(shù)組</param>
/// <param name="l">[可選]數(shù)組長(zhǎng)度,e為數(shù)組時(shí)需要此項(xiàng)</param>
#define append(...)

4、切片長(zhǎng)度

獲取切片長(zhǎng)度

/// <summary>
/// 切片長(zhǎng)度
/// </summary>
/// <param name="a">切片數(shù)組</param>
/// <returns>切片長(zhǎng)度</returns>
#define len(a)

5、切片容量

獲取切片容量

/// <summary>
/// 切片容量
/// </summary>
/// <param name="a">切片數(shù)組</param>
/// <returns> 切片容量</returns>
#define cap(a)

二、完整代碼

slice.h

#ifndef SLICE_H
#define SLICE_H
#include<stddef.h>
/************************************************************************
* @Project:      Slice
* @Decription:  切片
* 相當(dāng)于動(dòng)態(tài)數(shù)組,用法與go語(yǔ)言的slice類似
* @Verision:      v1.0.0
* @Author:      Xin Nie
* @Create:      2024/03/25 01:02:00
* @LastUpdate:  2024/03/25 01:02:00
************************************************************************
* Copyright @ 2024. All rights reserved.
************************************************************************/
/// <summary>
/// 創(chuàng)建切片
/// </summary>
/// <param name="t">元素類型</param>
/// <param name="cap">切片容量</param>
/// <returns>切片數(shù)組</returns>
#define make(t,cap)_slice_make(sizeof(t),cap)
/// <summary>
/// 銷毀切片
/// </summary>
/// <param name="a">切片數(shù)組</param>
#define unmake(a)_slice_umake(a);a=0
/// <summary>
/// 添加元素、數(shù)組
/// </summary>
/// <param name="a">切片數(shù)組</param>
/// <param name="e">元素、數(shù)組</param>
/// <param name="l">[可選]數(shù)組長(zhǎng)度,e為數(shù)組時(shí)需要此項(xiàng)</param>
#define append(...)_ACF_COUNT_ARG(__VA_ARGS__)
/// <summary>
/// 切片長(zhǎng)度
/// </summary>
/// <param name="a">切片數(shù)組</param>
/// <returns>切片長(zhǎng)度</returns>
#define len(a) _slice_len( a)
/// <summary>
/// 切片容量
/// </summary>
/// <param name="a">切片數(shù)組</param>
/// <returns>切片容量</returns>
#define cap(a) _slice_cap( a)
///私有方法
#define _ACF_ARG_T(t)  t 
#define _ACF_ARG_N(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,N,...)  N
#define _ARG_N_HELPER(...)  _ACF_ARG_T(_ACF_ARG_N(__VA_ARGS__))  
#define _ACF_COUNT_ARG(...)  _ARG_N_HELPER(__VA_ARGS__,16,15,14,13,12,11,10,9,8,7,6,5,4,_APPEND_ARRAY(__VA_ARGS__),_APPEND(__VA_ARGS__),1 ,0) 
#define _APPEND(a,e)a=_slice_append(a,0,sizeof(*a));a[len(a)-1] = e
#define _APPEND_ARRAY(a,e,l)_slice_appendArray(a,sizeof(*e),e,l)
void* _slice_make(size_t elementSize, size_t sliceCap);
void* _slice_append(void* array, void* element, size_t elementSize);
void* _slice_appendArray(void* array, size_t elementSize, void* array2, size_t array2Size);
size_t _slice_len(void* array);
size_t _slice_cap(void* array);
void _slice_umake(void* array);
#endif

slice.c

#include "slice.h"
#include<stdlib.h>
typedef struct Slice {
	int length;
	int capacity;
	int elementSize;
}Slice;

void* _slice_make(size_t elementSize, size_t sliceCap) {
	Slice* slice = malloc(elementSize * sliceCap + sizeof(Slice));
	if (slice)
	{
		slice->capacity = sliceCap;
		slice->elementSize = elementSize;
		slice->length = 0;
		return slice + 1;
	}
	return NULL;
}

void* _slice_append(void* array, void* element, size_t elementSize) {
	Slice* slice = (array ? (Slice*)array : (Slice*)_slice_make(elementSize, 4)) - 1;
	if (slice->capacity == slice->length) {
		slice->capacity = slice->capacity == 0 ? 4 : slice->capacity * 2;
		if ((slice = realloc(slice, slice->capacity * slice->elementSize + sizeof(Slice))) == NULL)return NULL;
	}
	if(element)
	{
		char* p = slice + 1;
		memcpy(p + slice->elementSize * slice->length, element, slice->elementSize);
	}
	slice->length++;
	return  slice + 1;
}

void* _slice_appendArray(void* array, size_t elementSize, void* array2, size_t array2Size) {
	Slice* slice = (array ? (Slice*)array : (Slice*)_slice_make(elementSize, array2Size)) - 1;
	int newCap = slice->capacity;
	while (newCap < slice->length+ array2Size) {
		newCap << 1;
	}
	if (slice->capacity < newCap) {
		slice->capacity = newCap;
		if ((slice = realloc(slice, slice->capacity * slice->elementSize + sizeof(Slice))) == NULL)return NULL;
	}
	char* p = slice + 1;
	memcpy(p + slice->elementSize * slice->length, array2, slice->elementSize * array2Size);
	slice->length += array2Size;
	return  slice + 1;
}

size_t _slice_len(void* array) {
	if (!array)return 0;
	Slice* slice = (Slice*)array - 1;
	return slice->length;
}

size_t _slice_cap(void* array) {
	if (!array)return 0;
	Slice* slice = (Slice*)array - 1;
	return slice->capacity;
}

void _slice_umake(void* array) {
	if (array)
	{
		Slice* slice = (Slice*)array - 1;
		free(slice);
	}
}

三、使用示例

1、一般使用流程

#include"slice.h"
#include<stdio.h>
void main() {
    //創(chuàng)建切片,返回的是數(shù)組完全可以當(dāng)成數(shù)組使用,通過len可以獲取數(shù)組長(zhǎng)度。
    int* a = make(int, 0);
    int b[] = { 1,2,3 };
    //添加元素
    a = append(a, 6510);
    //添加數(shù)組
    a = append(a, b, 3);
    //循環(huán)添加元素
    for (int i = 0; i < 1024; i++)
    {
        a = append(a, i);
    }
    //遍歷切片
    for (int i = 0; i < len(a); i++)
    {
        printf("%d ", a[i]);
    }
    //銷毀切片
    unmake(a);
}

效果預(yù)覽

2、直接append

#include"slice.h"
#include<stdio.h>
void main() {

	//數(shù)組為空時(shí)可以直接通過append產(chǎn)生切片
	int* a = NULL;
	int b[] = { 1,2,3 };
	//添加元素
	a = append(a, 6510);
	//添加數(shù)組
	a = append(a, b, 3);
	//循環(huán)添加元素
	for (int i = 0; i < 1024; i++)
	{
		a = append(a, i);
	}
	//遍歷切片
	for (int i = 0; i < len(a); i++)
	{
		printf("%d ", a[i]);
	}
	//銷毀切片
	unmake(a);
}

3、自定義類型

typedef struct VideoScale {
    int align;
    int width;
    int height;
    enum AVPixelFormat format;
    struct SwsContext* ctx;
    AVFrame* frame;
} VideoScale;
VideoScale* video_scales = NULL;
VideoScale t;
video_scales = append(video_scales, t);
for (int i = 0; i < len(video_scales);i++) {
    int frame = video_scales[i].frame;
    //其他操作略...
}
unmake(is->video_scales);

總結(jié)

本文僅僅簡(jiǎn)單實(shí)現(xiàn)了切片,這種方式使用動(dòng)態(tài)數(shù)組會(huì)很方便,這是一種新的思路,其他的集合類型也可以考慮用這種方式實(shí)現(xiàn),尤其是能夠統(tǒng)一一套接口,且簡(jiǎn)單易用,將能極大的提高c語(yǔ)言開發(fā)效率。

以上就是C語(yǔ)言實(shí)現(xiàn)切片數(shù)組的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言切片的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解C++中類的六大默認(rèn)成員函數(shù)

    詳解C++中類的六大默認(rèn)成員函數(shù)

    這篇文章主要介紹了C++類中的六大默認(rèn)成員函數(shù)的原理雨使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • C++11中列表初始化機(jī)制的概念與實(shí)例詳解

    C++11中列表初始化機(jī)制的概念與實(shí)例詳解

    在我們實(shí)際編程中,我們經(jīng)常會(huì)碰到變量初始化的問題,對(duì)于不同的變量初始化的手段多種多樣,下面這篇文章主要給大家介紹了關(guān)于C++11中列表初始化機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • 詳解C/C++中const關(guān)鍵字的用法及其與宏常量的比較

    詳解C/C++中const關(guān)鍵字的用法及其與宏常量的比較

    簡(jiǎn)單的說const關(guān)鍵字修飾的變量具有常屬性,也就是說它所修飾的變量不能被修改,下文給大家介紹C/C++中const關(guān)鍵字的用法及其與宏常量的比較,需要的朋友可以參考下
    2017-07-07
  • 詳解C++元編程之Parser Combinator

    詳解C++元編程之Parser Combinator

    借助C++的constexpr能力,可以輕而易舉的構(gòu)造Parser Combinator,對(duì)用戶定義的字符串(User defined literal)釋放了巨大的潛力。
    2021-05-05
  • C++中atof?函數(shù)的介紹

    C++中atof?函數(shù)的介紹

    這篇文章主要給大家分享的是C++中atof?函數(shù)的介紹,在?stdlib.h?中?atof?函數(shù),可用于將?char?字符串轉(zhuǎn)為?float?/?double?浮點(diǎn)數(shù)類型,想具體了解語(yǔ)法的小伙伴可以參考下面文章的內(nèi)容,希望對(duì)大家有所幫助
    2021-11-11
  • C++全面細(xì)致講解復(fù)數(shù)類

    C++全面細(xì)致講解復(fù)數(shù)類

    本文章向大家介紹C++ 標(biāo)準(zhǔn)庫(kù)中的復(fù)數(shù)類,主要包括C++ 標(biāo)準(zhǔn)庫(kù)中的復(fù)數(shù)類使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-06-06
  • 變量定義與聲明的區(qū)別詳細(xì)解析

    變量定義與聲明的區(qū)別詳細(xì)解析

    外部變量(全局變量)的"定義"與外部變量的"聲明"是不相同的,外部變量的定義只能有一次,它的位置是在所有函數(shù)之外,而同一個(gè)文件中的外部變量聲明可以是多次的,它可以在函數(shù)之內(nèi)(哪個(gè)函數(shù)要用就在那個(gè)函數(shù)中聲明)也可以在函數(shù)之外(在外部變量的定義點(diǎn)之前)
    2013-09-09
  • 詳解C++中的內(nèi)聯(lián)函數(shù)和函數(shù)重載

    詳解C++中的內(nèi)聯(lián)函數(shù)和函數(shù)重載

    這篇文章主要介紹了詳解C++中的內(nèi)聯(lián)函數(shù)和函數(shù)重載,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • Unix下C程序內(nèi)存泄漏檢測(cè)工具Valgrind的安裝與使用詳解

    Unix下C程序內(nèi)存泄漏檢測(cè)工具Valgrind的安裝與使用詳解

    以下是對(duì)Unix下C程序內(nèi)存泄漏檢測(cè)工具Valgrind的安裝與使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • C++實(shí)現(xiàn)通訊錄小功能

    C++實(shí)現(xiàn)通訊錄小功能

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)通訊錄小功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評(píng)論

阿拉善右旗| 安国市| 朝阳市| 自贡市| 徐闻县| 台南市| 太保市| 西昌市| 安溪县| 石林| 萍乡市| 东光县| 乡城县| 肥城市| 沾益县| 德格县| 平塘县| 彰化市| 鹤庆县| 北京市| 通州区| 晋城| 衡水市| 微山县| 七台河市| 绥棱县| 黑龙江省| 福建省| 阜宁县| 繁峙县| 永顺县| 砀山县| 板桥市| 武夷山市| 潜山县| 浙江省| 元谋县| 分宜县| 萨嘎县| 临城县| 东兰县|