数组及常用算法

  • 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)--数组及常用算法相关推荐

  1. javascript系列--javascript数组的常用算法解析

    一.不改变原数组,返回新数组(字符串) 1.concat() 连接两个或者多个数组,两边的原始数组都不会变化,返回的是被连接数组的一个副本. 2.join() 把数组中所有的元素放入到一个字符串中,返 ...

  2. day19 java数组的常用算法和排序

    1.冒泡排序法 2.选择排序法 3.二分查找 4.array常见工具类 以后补充

  3. 第四百一十四节,python常用算法学习

    本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机 ...

  4. 计算c53的c语言的程序,C程序设计的常用算法.doc

    ? HYPERLINK "/happy_dreamer/blog/item/902dbe2af96b2a25d52af16b.html" \o "C程序设计的常用算法&q ...

  5. 「五大常用算法」一文图解分治算法和思想

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 前言 分 ...

  6. c语言考试算法,c语言考试常用算法docx.docx

    c语言考试常用算法docx 求1~100的累加和#includevoid main(){inti=1,sum=0;while (i<=100){sum+=i;i++;}printf(" ...

  7. 常用算法25讲,拿走不谢!

    算法对于程序员而言,到底有多重要,这已经是一个老生常谈的话题了.我看过很多有潜力且非常努力的程序员,在进阶高级工程师或架构师的路上,栽在了"算法"上,说实话,我并不意外. 如果说得 ...

  8. php面试带项目_PHP面试常用算法(推荐)

    一.冒泡排序 基本思想: 对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换.这样比较小(大)的数值就将逐渐从后面向前面移动. ...

  9. [C++ STL] 常用算法总结

    1 概述 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<alg ...

最新文章

  1. 数据库创建索引的原则
  2. linux docker安装mysql_Linux-docker安装mysql
  3. python os.system 不打印_Python初体验之我爱你
  4. 代码审计_strcmp比较字符串
  5. 解决ubuntu中vi不能正常使用方向键与退格键的问题
  6. android setCompoundDrawables和setCompoundDrawablesWithIntrinsicBounds区别
  7. 软件测试mysql存储过程的用处实例_软件测试中实际应用:MySQL5存储过程编写
  8. Python之旅:集合
  9. v​n​c​服​务​​安​装​与配置
  10. 《QTreeView中嵌入QPushButton实现命令操作》:系列教程之八(第8小节)
  11. Gym 100781A Adjoin the Networks——树的直径
  12. Windows Mobile 7.0最新消息!!
  13. 工具栏ToolStrip
  14. 在word中怎么把文字往下挪挪_word排版技巧:如何对页面文本段落快速调整
  15. 老男孩22期python视频_老男孩Ptython全栈架构师视频教程 Python最新整理完整版22期视频教程 超60G课程容量...
  16. H5 App开发技术如何进行选型 ?
  17. android分贝仪界面,android声音检测仪---分贝仪 (附源码)
  18. Camstar 刷新缓存服务CDO
  19. Java虚拟机|JVM知识点汇总及简述->性能监控与调优
  20. 各种计算机语言的区别

热门文章

  1. 解决bbb无法加载uImage问题
  2. 13c语言中的文件是一种流式文件,读写时均以字符为单位.,C语言判断题部分.doc...
  3. 双网卡绑定linux7.2,CentOS 7.2 bond实现网卡聚合链路(双网卡绑定)脚本及验证(适合云平台)...
  4. delete hive_Hive高级调优
  5. r语言ggplot2一夜多图_ggplot2绘图:多张图合并为一张
  6. 高斯投影坐标系为什么是六七八位数
  7. 【转】重新打包DebianISO实现无人应答安装(UEFI+BIOS)
  8. C# Azure 存储-Blob
  9. 什么是ASP.NET Boilerplate Project(ABP)框架
  10. 【转】Azure DevOps —— Azure Board 之 长篇故事、特性、用户情景(故事)的用法应用场景