數組:
C++中的數組和C中一樣,數組大小不可更改,必須聲明時確定數組大小,只有在初始化時才能一次性賦值,後續賦值只能按索引單個元素賦值;
數組雖然不夠靈活,但效率很高,對於特定情況作用很大。
下面是數組的幾種可行聲明和初始化:
int seconds[2] = { 1,2 }; //一般聲明
int year[6] = { 2011,2012,2013,2014,2015 }; //數組內元素個數可以小於數組大小,少的部分默認爲0,但不能大於數組大小
int days[] = { 15,17,18 }; //會自動計算數組大小
int months[]{ 1,2,4 }; //可以省略=
數組的增刪查改:
//聲明數組
double power[20]; //數組的大小確定後不能再更改
//power = { 1,2,3,4 }; //數組只有初始化是才能一次性賦值,後續賦值只能一個元素一個元素賦值
int arrayLength = 0; //當前存在非默認值的數組長度
power[arrayLength++] = 3509;
power[arrayLength++] = 2109;
power[arrayLength++] = 2388;
power[arrayLength++] = 6621;
//升序排序(冒泡)
double temp;
for (int i = 0;i < arrayLength - 1;i++)
{
for (int j = 0; j < arrayLength -1-i; j++)
{
if (power[j]>power[j+1])
{
temp = power[j];
power[j] = power[j + 1];
power[j + 1] = temp;
}
}
}
for (int i = 0;i < arrayLength;i++)
{
cout << power[i] << "\t";
}
//數組的插入
//1.找到第一個比插入數字大的位置insertIndex
double insertNum; //要插入的數
cout << "\nEnter a num to insert" << endl;
cin >> insertNum; //輸入要插入的數
int insertIndex = 0; //要插入的元素下標
for (int i = 0;i < arrayLength;i++)
{
if (power[i]>insertNum)
{
insertIndex = i;
break;
}
}
//2.從最後一個元素開始,將數字複製到後面一個元素中
for (int i = arrayLength - 1;i >= insertIndex;i--)
{
//把前一個元素賦值給後一個元素
power[i + 1] = power[i];
}
//3.將要插入的數字賦值給下標爲insertIndex的元素
power[insertIndex] = insertNum;
//4.總長度+1
arrayLength++;
for (int i = 0;i < arrayLength;i++)
{
cout << power[i] << "\t";
}
//數組的單個元素刪除:
//1.找到要刪除的元素
double deleteNum; //要刪除的值
int deleteIndex = INT_MIN;
cout << "\nEnter a num to delete" << endl;
cin >> deleteNum;
for (int i = 0;i < arrayLength;i++)
{
if (power[i] == deleteNum)
{
deleteIndex = i;
break;
}
}
if (deleteIndex==INT_MIN) //判斷是否找到
{
cout << "Not found" << endl;
}
else
{
//2.從找到的下標開始,後面一個元素賦值給前面一個元素
for (int i = deleteIndex;i < arrayLength-1;i++)
{
power[i] = power[i+1];
}
//3.總長度-1
arrayLength--;
//打印
for (int i = 0;i < arrayLength;i++)
{
cout << power[i] << "\t";
}
}
二維數組可以理解爲多個(行數)一維數組的集合,每一行的元素個數爲列數
string stdNames[] = { "小明","小張","小王" };
string courseNames[]{ "語文","數學","英語" };
const int ROW = 3; //行數
const int COL = 3; //列數
double scores[ROW][COL]; //聲明二維數組
//輸入成績
for (int i = 0;i < ROW;i++)
{
for (int j = 0;j < COL;j++)
{
cout << stdNames[i] << "\t" << courseNames[j] <<":";
cin >> scores[i][j];
}
}
//打印最後成績
cout << endl<<"\t";
for (int i = 0;i < COL;i++) //打印一行課程名稱
{
cout << courseNames[i]<<"\t";
}
for (int i = 0;i < ROW;i++) //外層控制行
{
cout << "\n"<<stdNames[i]<<"\t"; //打印每一行的學生姓名
for (int j = 0;j < COL;j++) //內層控制列
{
cout << scores[i][j]<<"\t";
}
cout << "\n"; //每一行結束換行
}
vector:
vector可以暫時簡單理解爲一個靈活的,可以自由改變大小的一個類似數組的容器
vector雖然靈活,但效率不如單純數組,但相差不大,vector可以插入和刪除元素
vector的聲明和初始化:
vector<double> v1; //一般聲明
vector<int> v2(5); //默認5個空間
vector<int> v3(20, 90); //默認20個元素,每個元素的值都是90
v1 = { 1,2,2.3,5.6,2.2,77.2 }; //v1的賦值
vector的簡單使用包括遍歷和添加清空和排序:
//1.一種原始遍歷方法 把vector當數組一樣使用
for (int i = 0;i < v1.size();i++) //v1.size(); 返回容器中元素個數
{
cout << v1[i]<<"\t" ;
}
cout << endl;
v1.push_back(62.5); //在數組的末尾添加一個指定元素
//2.集合的通用遍歷方法,使用迭代器 iterator
//iterator的使用方法
vector<double>::iterator it1; //先限定iterator的類型(double),得到一個迭代器對象,實際是一個指針
//默認從第一個元素開始迭代,到最後一個元素
for (it1 = v1.begin();it1 != v1.end(); ++it1) //++it1 迭代器特有特性 並且不會有緩存
{
cout << *it1 << "\t"; //*it1 取得it1的地址,找到它的值並輸出
}
//3.排序
sort(v1.begin(),v1.end()); //需要使用頭文件<algorithm>
cout << endl;
for (it1 = v1.begin();it1 != v1.end(); ++it1) //++it1 迭代器特有特性 並且不會有緩存
{
cout << *it1 << "\t"; //*it1 取得it1的地址,找到它的值並輸出
}
reverse(v1.begin(), v1.end()); //逆序
v1.clear(); //清空vector