C++(8)--数组及常用算法
数组及常用算法
- 1.数组基本概念
- 2.一维数组
- 2.1数组的定义
- 2.2数组初始化
- 2.3一维数组动态赋初值
- 2.4一维数组应用实例
- 2.5一维数组的排序算法
- 2.6 一维数组元素的删除和插入
- array
- 3.二维数组
- 3.1数组定义
- 3.2二维数组的动态赋值
- 4.向量容器Vector
- 4.1定义和初始化
- 4.2 vector 迭代器遍历,sort, reverse,
《老九学堂C++课程》《C++ primer》学习笔记。《老九学堂C++课程》详情请到B站搜索《老九零基础学编程C++入门》
-------------简单的事情重复做,重复的事情用心做,用心的事情坚持做(老九君)---------------
1.数组基本概念
什么是数组:数组是一个变量,由数据类型相同的一组元素组成,在内存占一串连续的内存空间。
数组是一个类型:比如int 型的数组,类型就是int []
C++中数组元素必须拥有相同的数据类型加粗样式
数组基本要素:
1.表示符:数组的名称,用于区分不同的数组(用来表示数组的变量名)
2.数组元素:向数组中存放的数据
3.元素下标:对数组元素进行编号,表明元素在数组中的位置。从0开始,可以通过下标来访问数组
4.元素类型:数组中元素的数据类型
数组长度固定, 避免数组越界
使用数组的优点: 方便管理需要相同操作的数据
demo1:可以构成数组的一组元素?
在C/C++中可以构成一个数组,在java中不行
198, 98, ‘c’, 230 // 字符在C++中是整形存的
1, 0, true, false, 38, -1 // c++中布尔类型实际是整形
2.一维数组
可以存成数组的情况:学生单门学科的成绩,某类商品的单价,某人N个月的工资
2.1数组的定义
定义语法:
datatype arrayName[size];
demo:
int nums[25];
char array_of_name[30];
double curr_salary[35];
const int N = 5;
int nums[N];
nums[0] = 9527;
const int N = 5;
int nums[N];
nums[0] = 9527;
注意:C++中数组的大小可以定义变量,C中不可以可以定义成变量
2.2数组初始化
用大括号初始化元素内容
int years[6] = {2012,2013,2014,2015,2016,2017}; //可以少给元素,但是不能多给
int months[12] = {1, 3, 5, 7}; // 未初始化的元素默认值未0
int days[] = {1,15}; // 不设定数组大小,编译器自动计算数组大小
int array[] = {} // ❌,未知元素个数是不可以的
c++ 11中新的改动:
a.初始化是可以不用等于号;
b.大括号可以为空,默认为所有元素执行置0操作
int days[] {};
float m[100] {};
2.3一维数组动态赋初值
动态从键盘录入信息,赋值给数组
int main(){int N = 5;double scores[N];//for(int i = 0; i < N; i++){for(int i = 0; i < sizeof(scores) / sizeof(double); i++){cout << "请输入第" << i + 1 << "课程的成绩:" ;cin >> scores[i];}for(int i = 0; i < N; i++){cout << scores[i] << endl;}return 0;
}
注意C++中数组没有.len()的属性,没法直接获得数组的长度。
2.4一维数组应用实例
demo1:一维数组求和,求平均
int main(){int main(){int nums[7] = {8, 4, 2, 1, 23, 344, 12};int nums_len = sizeof(nums) / sizeof(nums[0]);int sum = 0;double average = 0;for(int i = 0; i < nums_len; i++){cout << nums[i] << " ";sum += nums[i];}average = sum / nums_len;cout << "和为:" << sum << ", 均值为:" << average << endl;return 0;
}
demo2: 找出数组的最大值,最小值
// 求数组的最大值最小值int min_val = nums[0], max_val = nums[0]; //假设第一个元素为最小值/最大值,其后的元素依次和最大最小比,然后更新最大值/最小值int min_index = 0, max_index = 0;for(int i = 1; i < nums_len; i ++){if(nums[i] < min_val){min_val = nums[i];min_index = i;}if(nums[i] > max_val){max_val = nums[i];max_index = i;}}cout << "最小值为:" << min_val << ", 对应的下标为:" << min_index << endl;cout << "最大值为:" << max_val << ", 对应的下标为:" << max_index << endl;
demo3:定义一个整形数组,找出奇数/偶数元素的个数
// 定义一个整形数组,找出奇数/偶数元素的个数int odd_count = 0, even_count = 0;for(int i = 0; i < nums_len; i++){if(nums[i] % 2 == 0){even_count += 1;}else{odd_count += 1;}}cout << "偶数有:" << even_count << "个, 奇数有:" << odd_count << "个" <<endl;
demo4:查找数组中是否存在某个元素,如果存在返回元素在数组中的下标,不存在返回-1
//查找数组中是否存在某个元素,如果存在返回元素在数组中的下标,不存在返回-1int searchNum;int searchIndex = -1; //初值值是一个不可能达到的值,如果最后他还是这个不可能达到的值,那么就没找到cout << "请输出要查找的数字" << endl;cin >> searchNum;for(int i = 0; i < nums_len; i++){if (nums[i] == searchNum){searchIndex = i;break;}}if(searchIndex == -1){cout << "没有查到要找的数字" << endl;}else{cout << "要查找的数字在数组中的下标为:" << searchIndex << endl;}
2.5一维数组的排序算法
1.冒泡排序
每次相邻的元素比较,将较大或者较小的元素放着后面,依次比较,较小/较大的数字就会冒到最后面 。
int main(){// 循环输入5个整形数字,进行降序排列后输出结果int n = 5;int nums[5] = {};for(int i = 0; i < n; i++){cout << "请输入数字" << endl;cin >> nums[i];}// 选择排序法// 每次找剩下元素的最大值/最小(和老师讲的有点不一样,但实质是一样的)for(int i = 0; i < n; i++){for(int j = i+1; j < n; j++){if(nums[i] < nums[j]){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}}for(int i = 0; i < n; i++){cout << nums[i] << endl;}
2.选择排序
int main(){// 循环输入5个整形数字,进行降序排列后输出结果int n = 5;int nums[5] = {};for(int i = 0; i < n; i++){cout << "请输入数字" << endl;cin >> nums[i];}// 选择排序法// 每次找剩下元素的最大值/最小(和老师讲的有点不一样,但实质是一样的)for(int i = 0; i < n; i++){for(int j = i+1; j < n; j++){if(nums[i] < nums[j]){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}}for(int i = 0; i < n; i++){cout << nums[i] << endl;}return 0;
}
2.6 一维数组元素的删除和插入
数组的大小一旦确定了,就无法改变。
int main(){// 有序数组的插入和删除//数组的删除和插入(数组一旦定义,大小不能改变,所以本例子说的是数组的长度远大于有效存储元素的个数)double power[99];int powerCount = 0; // 当前数组中元素的个数power[powerCount++] = 45760;power[powerCount++] = 45770;power[powerCount++] = 45772;power[powerCount++] = 45773;double tmp;for(int i = 0; i < powerCount; i++){for(int j = 1; j < powerCount - i; j ++){if(power[j] < power[j-1]){tmp = power[j];power[j] = power[j-1];power[j-1] = tmp;}}}cout << "排序后的数组为:" << endl;for(int i = 0; i < powerCount; i++){cout << power[i] << "\t";}cout << endl;}
//插入数字,插入新数字之后数组依旧有序cout << "请输入要插入的数字" << endl;double insert_power;cin >> insert_power; // 1. 放在末尾,再排序// 2. 找到第一个比插入数大的元素位置,其后的元素一次往后移动一位int insert_index = powerCount;for(int i = 0; i < powerCount; i++){if(power[i] > insert_power){cout << power[i] << insert_power;insert_index = i;break;}}for(int i = powerCount-1; i >= insert_index; i--){power[i+1] = power[i];}power[insert_index] = insert_power;powerCount+=1;cout << "插入元素后的数组为"<< endl;for(int i = 0; i < powerCount; i++){cout << power[i] << "\t";}
// 删除元素,找到要删除的元素位置,将其后的元素往前移动一位// 没有判断相同元素double delete_power;int delete_index = -1;cout << "请输出要删除的元素" << endl;cin >> delete_power;for(int i = 0; i < powerCount; i++){if(power[i] == delete_power){delete_index = i;break;}}if(delete_index == -1){cout << "没有找到要删除的元素" << endl;}else{for(int i = delete_index; i < powerCount; i++){power[i] = power[i+1];}powerCount-=1;cout << "删除元素后的数组为"<< endl;for(int i = 0; i < powerCount; i++){cout << power[i] << "\t";}}return 0;
//}
array
用array定义数组与原来的方式定义数组效果是一样的
#include <array>
int value1[5];
array<int 5> value2; //至少是c++11才支持
3.二维数组
3.1数组定义
datatype name[rowSize][colSize];
double score[5][3]
int prices[4][4]
3.2二维数组的动态赋值
demo:输入学生各门课程的成绩
在这里插入代码片int main(){string stu_names[] = {"刘备","关羽", "张飞"};string course_names[] = {"数学", "语文", "英语"};const int ROW = 3; // sizeof(stu_names) / sizeof(stu_names[0]) 双字名字下可以这么写,其他情况下不行const int COL = 3;double scores[ROW][COL];for(int i = 0; i < ROW; i++){for(int j = 0; j < COL; j++){cout << stu_names[i] << "的" << course_names[j] << "成绩为:";cin >> scores[i][j];}}cout << "\t";for(int i = 0; i < COL; i++){cout << course_names[i] << "\t";}cout << endl;for(int i = 0; i < ROW; i++){cout << stu_names[i] << "\t";for(int j = 0; j < COL; j++){cout << scores[i][j] << "\t";}cout << endl;}return 0;
}
数学 语文 英语
刘备 1 2 3
关羽 4 5 6
张飞 7 8 9
4.向量容器Vector
1.动态数组,可以在运行阶段设置长度
2.具有数组的快速索引方式
3.可以插入和删除元素
4.1定义和初始化
尖角号:范型编程
vector <double> vec1;
vector <string> vec2(5)); \\分配5个空间;
vector <int> vec3(20,998); \\ 分配2个空间,空间元素都是998
vector常有的操作:
常用操作 | |
---|---|
clear() | 移除容器中的所有数据 |
empty() | 判断容器是否为空 |
size() | 返回容器中元素的个数 |
[index],at(index) | 返回索引为index的元素 |
erase(pos) | 删除pos 位置处的数据 |
erase(beg, end) | 删除[beg, end) 区间的数据 |
front() | 返回第一个元素 |
insert(pos, elem) | 在pos位置插入一个元素 |
pop_back() | 删除最后一个元素 |
push_back(elem) | 在容器的末尾插入一个元素 |
resize(num) | 重新设置一个容器的大小 |
begin(),end() | 返回容器首尾元素的迭代器 |
新增两个头文件
#include <vector>
#include <algorithm>
4.2 vector 迭代器遍历,sort, reverse,
int main(){// vector <double> vectDouble = {98.5, 67.9, 43.6, 32.9}; c++ 98 中不能初始化并赋初值vector <double> vectDouble;// 向数组中插入数字vectDouble.push_back(100.8);vectDouble.push_back(99.8);vectDouble.push_back(102.5);// 不专业输出for(int i = 0; i < vectDouble.size(); i++){cout << vectDouble[i] << "\t";}// 集合的通用遍历方法,使用迭代器 iteratorvector<double>::iterator it; //定义一个vector<double>类型的迭代器, 实际上是一个指针for(it = vectDouble.begin(); it != vectDouble.end(); it++){cout << *it << "\t";}// 排序sort(vectDouble.begin(), vectDouble.end());for(it = vectDouble.begin(); it != vectDouble.end(); it++){cout << *it << "\t";}//逆序reverse(vectDouble.begin(), vectDouble.end());for(it = vectDouble.begin(); it != vectDouble.end(); it++){cout << *it << "\t";}return 0;
}
定义多大多大,push_back会/可以改变容量,但是效率不高。
当内存容量不够的时候的应对机制:申请一块更大的存储区,将所有的元素放入到新的存储区中。将旧的内存释放掉。
建议vector中不要放复杂对象,要放指针。(这么处理的妙处??)
C++(8)--数组及常用算法相关推荐
- javascript系列--javascript数组的常用算法解析
一.不改变原数组,返回新数组(字符串) 1.concat() 连接两个或者多个数组,两边的原始数组都不会变化,返回的是被连接数组的一个副本. 2.join() 把数组中所有的元素放入到一个字符串中,返 ...
- day19 java数组的常用算法和排序
1.冒泡排序法 2.选择排序法 3.二分查找 4.array常见工具类 以后补充
- 第四百一十四节,python常用算法学习
本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机 ...
- 计算c53的c语言的程序,C程序设计的常用算法.doc
? HYPERLINK "/happy_dreamer/blog/item/902dbe2af96b2a25d52af16b.html" \o "C程序设计的常用算法&q ...
- 「五大常用算法」一文图解分治算法和思想
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 前言 分 ...
- c语言考试算法,c语言考试常用算法docx.docx
c语言考试常用算法docx 求1~100的累加和#includevoid main(){inti=1,sum=0;while (i<=100){sum+=i;i++;}printf(" ...
- 常用算法25讲,拿走不谢!
算法对于程序员而言,到底有多重要,这已经是一个老生常谈的话题了.我看过很多有潜力且非常努力的程序员,在进阶高级工程师或架构师的路上,栽在了"算法"上,说实话,我并不意外. 如果说得 ...
- php面试带项目_PHP面试常用算法(推荐)
一.冒泡排序 基本思想: 对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换.这样比较小(大)的数值就将逐渐从后面向前面移动. ...
- [C++ STL] 常用算法总结
1 概述 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<alg ...
最新文章
- 数据库创建索引的原则
- linux docker安装mysql_Linux-docker安装mysql
- python os.system 不打印_Python初体验之我爱你
- 代码审计_strcmp比较字符串
- 解决ubuntu中vi不能正常使用方向键与退格键的问题
- android setCompoundDrawables和setCompoundDrawablesWithIntrinsicBounds区别
- 软件测试mysql存储过程的用处实例_软件测试中实际应用:MySQL5存储过程编写
- Python之旅:集合
- v​n​c​服​务​​安​装​与配置
- 《QTreeView中嵌入QPushButton实现命令操作》:系列教程之八(第8小节)
- Gym 100781A Adjoin the Networks——树的直径
- Windows Mobile 7.0最新消息!!
- 工具栏ToolStrip
- 在word中怎么把文字往下挪挪_word排版技巧:如何对页面文本段落快速调整
- 老男孩22期python视频_老男孩Ptython全栈架构师视频教程 Python最新整理完整版22期视频教程 超60G课程容量...
- H5 App开发技术如何进行选型 ?
- android分贝仪界面,android声音检测仪---分贝仪 (附源码)
- Camstar 刷新缓存服务CDO
- Java虚拟机|JVM知识点汇总及简述->性能监控与调优
- 各种计算机语言的区别
热门文章
- 解决bbb无法加载uImage问题
- 13c语言中的文件是一种流式文件,读写时均以字符为单位.,C语言判断题部分.doc...
- 双网卡绑定linux7.2,CentOS 7.2 bond实现网卡聚合链路(双网卡绑定)脚本及验证(适合云平台)...
- delete hive_Hive高级调优
- r语言ggplot2一夜多图_ggplot2绘图:多张图合并为一张
- 高斯投影坐标系为什么是六七八位数
- 【转】重新打包DebianISO实现无人应答安装(UEFI+BIOS)
- C# Azure 存储-Blob
- 什么是ASP.NET Boilerplate Project(ABP)框架
- 【转】Azure DevOps —— Azure Board 之 长篇故事、特性、用户情景(故事)的用法应用场景