日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++(8)--数组及常用算法

發(fā)布時間:2023/12/13 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++(8)--数组及常用算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

數(shù)組及常用算法

  • 1.數(shù)組基本概念
  • 2.一維數(shù)組
    • 2.1數(shù)組的定義
    • 2.2數(shù)組初始化
    • 2.3一維數(shù)組動態(tài)賦初值
    • 2.4一維數(shù)組應(yīng)用實例
    • 2.5一維數(shù)組的排序算法
    • 2.6 一維數(shù)組元素的刪除和插入
    • array
  • 3.二維數(shù)組
    • 3.1數(shù)組定義
    • 3.2二維數(shù)組的動態(tài)賦值
  • 4.向量容器Vector
    • 4.1定義和初始化
    • 4.2 vector 迭代器遍歷,sort, reverse,

《老九學(xué)堂C++課程》《C++ primer》學(xué)習(xí)筆記。《老九學(xué)堂C++課程》詳情請到B站搜索《老九零基礎(chǔ)學(xué)編程C++入門》
-------------簡單的事情重復(fù)做,重復(fù)的事情用心做,用心的事情堅持做(老九君)---------------

1.數(shù)組基本概念

什么是數(shù)組:數(shù)組是一個變量,由數(shù)據(jù)類型相同的一組元素組成,在內(nèi)存占一串連續(xù)的內(nèi)存空間。

數(shù)組是一個類型:比如int 型的數(shù)組,類型就是int []
C++中數(shù)組元素必須擁有相同的數(shù)據(jù)類型加粗樣式

數(shù)組基本要素
1.表示符:數(shù)組的名稱,用于區(qū)分不同的數(shù)組(用來表示數(shù)組的變量名)
2.數(shù)組元素:向數(shù)組中存放的數(shù)據(jù)
3.元素下標(biāo):對數(shù)組元素進行編號,表明元素在數(shù)組中的位置。從0開始,可以通過下標(biāo)來訪問數(shù)組
4.元素類型:數(shù)組中元素的數(shù)據(jù)類型
數(shù)組長度固定, 避免數(shù)組越界

使用數(shù)組的優(yōu)點: 方便管理需要相同操作的數(shù)據(jù)

demo1:可以構(gòu)成數(shù)組的一組元素?
在C/C++中可以構(gòu)成一個數(shù)組,在java中不行

198, 98, ‘c’, 230 // 字符在C++中是整形存的
1, 0, true, false, 38, -1 // c++中布爾類型實際是整形

2.一維數(shù)組

可以存成數(shù)組的情況:學(xué)生單門學(xué)科的成績,某類商品的單價,某人N個月的工資

2.1數(shù)組的定義

定義語法:

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++中數(shù)組的大小可以定義變量,C中不可以可以定義成變量

2.2數(shù)組初始化

用大括號初始化元素內(nèi)容

int years[6] = {2012,2013,2014,2015,2016,2017}; //可以少給元素,但是不能多給
int months[12] = {1, 3, 5, 7}; // 未初始化的元素默認值未0
int days[] = {1,15}; // 不設(shè)定數(shù)組大小,編譯器自動計算數(shù)組大小
int array[] = {} // ?,未知元素個數(shù)是不可以的

c++ 11中新的改動:
a.初始化是可以不用等于號;
b.大括號可以為空,默認為所有元素執(zhí)行置0操作

int days[] {};
float m[100] {};

2.3一維數(shù)組動態(tài)賦初值

動態(tài)從鍵盤錄入信息,賦值給數(shù)組

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++中數(shù)組沒有.len()的屬性,沒法直接獲得數(shù)組的長度。

2.4一維數(shù)組應(yīng)用實例

demo1:一維數(shù)組求和,求平均

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: 找出數(shù)組的最大值,最小值

// 求數(shù)組的最大值最小值int min_val = nums[0], max_val = nums[0]; //假設(shè)第一個元素為最小值/最大值,其后的元素依次和最大最小比,然后更新最大值/最小值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 << ", 對應(yīng)的下標(biāo)為:" << min_index << endl;cout << "最大值為:" << max_val << ", 對應(yīng)的下標(biāo)為:" << max_index << endl;

demo3:定義一個整形數(shù)組,找出奇數(shù)/偶數(shù)元素的個數(shù)

// 定義一個整形數(shù)組,找出奇數(shù)/偶數(shù)元素的個數(shù)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 << "偶數(shù)有:" << even_count << "個, 奇數(shù)有:" << odd_count << "個" <<endl;

demo4:查找數(shù)組中是否存在某個元素,如果存在返回元素在數(shù)組中的下標(biāo),不存在返回-1

//查找數(shù)組中是否存在某個元素,如果存在返回元素在數(shù)組中的下標(biāo),不存在返回-1int searchNum;int searchIndex = -1; //初值值是一個不可能達到的值,如果最后他還是這個不可能達到的值,那么就沒找到cout << "請輸出要查找的數(shù)字" << endl;cin >> searchNum;for(int i = 0; i < nums_len; i++){if (nums[i] == searchNum){searchIndex = i;break;}}if(searchIndex == -1){cout << "沒有查到要找的數(shù)字" << endl;}else{cout << "要查找的數(shù)字在數(shù)組中的下標(biāo)為:" << searchIndex << endl;}

2.5一維數(shù)組的排序算法

1.冒泡排序
每次相鄰的元素比較,將較大或者較小的元素放著后面,依次比較,較小/較大的數(shù)字就會冒到最后面 。

int main(){// 循環(huán)輸入5個整形數(shù)字,進行降序排列后輸出結(jié)果int n = 5;int nums[5] = {};for(int i = 0; i < n; i++){cout << "請輸入數(shù)字" << endl;cin >> nums[i];}// 選擇排序法// 每次找剩下元素的最大值/最小(和老師講的有點不一樣,但實質(zhì)是一樣的)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(){// 循環(huán)輸入5個整形數(shù)字,進行降序排列后輸出結(jié)果int n = 5;int nums[5] = {};for(int i = 0; i < n; i++){cout << "請輸入數(shù)字" << endl;cin >> nums[i];}// 選擇排序法// 每次找剩下元素的最大值/最小(和老師講的有點不一樣,但實質(zhì)是一樣的)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 一維數(shù)組元素的刪除和插入

數(shù)組的大小一旦確定了,就無法改變。

int main(){// 有序數(shù)組的插入和刪除//數(shù)組的刪除和插入(數(shù)組一旦定義,大小不能改變,所以本例子說的是數(shù)組的長度遠大于有效存儲元素的個數(shù))double power[99];int powerCount = 0; // 當(dāng)前數(shù)組中元素的個數(shù)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 << "排序后的數(shù)組為:" << endl;for(int i = 0; i < powerCount; i++){cout << power[i] << "\t";}cout << endl;} //插入數(shù)字,插入新數(shù)字之后數(shù)組依舊有序cout << "請輸入要插入的數(shù)字" << endl;double insert_power;cin >> insert_power; // 1. 放在末尾,再排序// 2. 找到第一個比插入數(shù)大的元素位置,其后的元素一次往后移動一位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 << "插入元素后的數(shù)組為"<< 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 << "刪除元素后的數(shù)組為"<< endl;for(int i = 0; i < powerCount; i++){cout << power[i] << "\t";}}return 0; //}

array

用array定義數(shù)組與原來的方式定義數(shù)組效果是一樣的

#include <array> int value1[5]; array<int 5> value2; //至少是c++11才支持

3.二維數(shù)組

3.1數(shù)組定義

datatype name[rowSize][colSize];
double score[5][3]
int prices[4][4]

3.2二維數(shù)組的動態(tài)賦值

demo:輸入學(xué)生各門課程的成績

在這里插入代碼片int main(){string stu_names[] = {"劉備","關(guān)羽", "張飛"};string course_names[] = {"數(shù)學(xué)", "語文", "英語"};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] << "成績?yōu)?#xff1a;";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; } 數(shù)學(xué) 語文 英語 劉備 1 2 3 關(guān)羽 4 5 6 張飛 7 8 9

4.向量容器Vector

1.動態(tài)數(shù)組,可以在運行階段設(shè)置長度
2.具有數(shù)組的快速索引方式
3.可以插入和刪除元素

4.1定義和初始化

尖角號:范型編程

vector <double> vec1;
vector <string> vec2(5)); \\分配5個空間;
vector <int> vec3(20,998); \\ 分配2個空間,空間元素都是998

vector常有的操作:

常用操作
clear()移除容器中的所有數(shù)據(jù)
empty()判斷容器是否為空
size()返回容器中元素的個數(shù)
[index],at(index)返回索引為index的元素
erase(pos)刪除pos 位置處的數(shù)據(jù)
erase(beg, end)刪除[beg, end) 區(qū)間的數(shù)據(jù)
front()返回第一個元素
insert(pos, elem)在pos位置插入一個元素
pop_back()刪除最后一個元素
push_back(elem)在容器的末尾插入一個元素
resize(num)重新設(shè)置一個容器的大小
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;// 向數(shù)組中插入數(shù)字vectDouble.push_back(100.8);vectDouble.push_back(99.8);vectDouble.push_back(102.5);// 不專業(yè)輸出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會/可以改變?nèi)萘?#xff0c;但是效率不高。
當(dāng)內(nèi)存容量不夠的時候的應(yīng)對機制:申請一塊更大的存儲區(qū),將所有的元素放入到新的存儲區(qū)中。將舊的內(nèi)存釋放掉。
建議vector中不要放復(fù)雜對象,要放指針。(這么處理的妙處??)

總結(jié)

以上是生活随笔為你收集整理的C++(8)--数组及常用算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。