当前位置: 首页 > news >正文

new动态创建一维数组、qsort函数、折半查找

new动态创建一维数组

普通数组在栈上分配内存,栈很小;如果需要存放更多的元素,必须在堆上分配内存,堆很大

动态创建一维数组的语法 : 数据类型 *指针 = new 数据类型[数组长度];

释放一维数组的语法:delete [] 指针;

注意:

  • 动态创建的数组没有数组名,不能用sizeof运算符。(动态创建的数组没有数组名,不能用sizeof,如果一定要用的话结果为8(64位),普通创建的可以用sizeof(数组名))
  • 可以用数组表示法和指针表示法两种方式使用动态创建的数组。
  • 必须使用delete[]来释放动态数组的内存。delete只会释放下标为0元素的空间。
  • 不要释放同一个内存块两次(否则等同于操作野指针),这个在之前的指针里面就讲过了。
  • 对空指针用delete[]是安全的(释放内存后,应该把指针置空nullptr)。
  • 声明普通数组的时候,数组长度可以用变量,相当于在栈上动态创建数组,并且不需要释放。
  • 如果内存不足,调用new会产生异常,导致程序中止;如果在new关键字后面加(std::nothrow)选项,则返回nullptr,不会产生异常。在后面的操作前面判断数组是否为nullptr。
  • 为什么用delete[]释放数组的时候,不需要指定数组的大小?因为系统会自动跟踪已分配数组的内存。
  • C语言里面的malloc函数不能用delete[],delete[]与new[]配对。
  • delete也不能释放栈上面的内存。
#include<iostream>
using namespace std;

int main()
{
    int *arr = new int[10];
    
    for(int i = 0; i < 10; i++)
    {
        arr[i] = i;                    //数组表示
        cout<< "arr[" << i << "]=" << *(arr+i) <<endl;    //指针表示
    }

    delete[]arr;
}

qsort函数

qsort函数用于对各种数据类型的数组进行排序。

 函数原型:

void qsort (void* base, size_t num, size_t size,
            int (*compar)(const void*,const void*));

        第一个参数:数组的起始地址。

        第二个参数:数组元素的个数(数组长度)。

        第三个参数:数组元素的大小(sizeof(数组的数据类型))。

        第四个参数:回调函数的地址。

回调函数决定了排序的顺序,声明如下:

int compar(const void *p1, const void *p2);

        1)如果函数的返回值< 0 ,那么p1所指向元素会被排在p2所指向元素的前面。

        2)如果函数的返回值==0,那么p1所指向元素与p2所指向元素的顺序不确定。

        3)如果函数的返回值> 0 ,那么p1所指向元素会被排在p2所指向元素的后面。

 qsort()函数的其它细节:

  • 形参中的地址用void是为了支持任意数据类型,在回调函数中必须具体化。
  • size_t是C标准库中定义的,在64位系统中是8字节无符号整型(unsigned long long)。
  • typedef unsigned long long size_t
  • 排序的需求除了升序和降序,还有很多不可预知的情况,只能用回调函数。
#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。

int compasc(const void* p1, const void* p2)         // 升序的回调函数。
{
	return *((int*)p1) - *((int*)p2);
}

int compdesc(const void* p1, const void* p2)       // 降序的回调函数。
{
	return *((int*)p2) - *((int*)p1);
}

int main()
{
	int a[8] = { 4,2,7,5,8,6,1,3 };

	qsort(a,sizeof(a)/sizeof(int),sizeof(int),compasc);            // 对数组a进行升序排序。

	for (int i = 0; i < 8; i++)
	{
		cout << "a[" << i << "]=" << a[i] << endl;
	}

	qsort(a, sizeof(a) / sizeof(int), sizeof(int), compdesc);      // 对数组a进行降序排序。

	for (int i = 0; i < 8; i++)
	{
		cout << "a[" << i << "]=" << a[i] << endl;
	}
}

 折半查找

折半查找也叫二分查找,只适用于已排序的数组(升序降序都可以)。

#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。

// 在arr中查找key,成功返回key在arr中的数组下标,失败返回-1。
int search(int arr[], int len, int key)
{
	int low = 0, high = len-1, mid;          // 初始化:low=0,high=数组长度-1。

	while (low <= high)
	{
		mid = (low + high) / 2;     // 计算mid指针的位置。

		if (arr[mid] == key) return mid;         // 查找成功。     
		else if (arr[mid] > key) high = mid - 1;  // 继续在前半区查找。
		else low = mid + 1;                    // 继续在后半区查找。
	
	}

	return -1; // 查找失败。
}

int main()
{
	int a[10] = { 7,9,12,16,21,25,30,35,41,48 };    // 必须是已排好序的数组。

	if (search(a, 10, 30) >= 0) cout << "在数组a中查找成功。\n";
	else cout << "在数组a中查找失败。\n";
}

相关文章:

  • 数字电路和模拟电路-1基础知识
  • numpy中的seed
  • mysql特殊语法insert into .. on duplicate key update ..使用详解
  • 闭包:什么是闭包、闭包的作用、闭包的解决
  • 【概率论与数理统计(研究生课程)】知识点总结7(参数估计)
  • 精彩回顾 l Rust唠嗑室:Xline跨数据中心一致性管理
  • vue进阶04-vue文档生成工具vuepress2
  • HDLBits: 在线学习 SystemVerilog(十一)-Problem 60-64
  • Linux环境基础开发工具使用
  • IDEA使用swing创建应用程序
  • 22.0、C语言数据结构——二叉排序树
  • GSW同态加密方案学习
  • Java -- 每日一问:Exception 和 Error 有什么区别?
  • 使用 Typora 画图
  • Gradle 入门说难也不难,说简单吧也不简单~
  • [nginx文档翻译系列] 控制nginx
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • Apache的80端口被占用以及访问时报错403
  • C# 免费离线人脸识别 2.0 Demo
  • CSS 提示工具(Tooltip)
  • interface和setter,getter
  • js 实现textarea输入字数提示
  • node学习系列之简单文件上传
  • 工作中总结前端开发流程--vue项目
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 一道面试题引发的“血案”
  • 赢得Docker挑战最佳实践
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​linux启动进程的方式
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #pragma pack(1)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (四)鸿鹄云架构一服务注册中心
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .chm格式文件如何阅读
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Micro Framework 4.2 beta 源码探析
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [Android]创建TabBar
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [c]扫雷
  • [CTF]php is_numeric绕过
  • [EFI]Acer Aspire A515-54g电脑 Hackintosh 黑苹果efi引导文件
  • [ESP32 IDF]web server
  • [fsevents@^2.1.2] optional install error: Package require os(darwin) not compatible with your platfo
  • [iphone-cocos2d]关于Loading的若干处理和讨论
  • [ITIL学习笔记]之事件管理(2)
  • [Java并发编程实战] 共享对象之可见性