数组:
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