C++ 复合类型(三)--数组vector、array

时间:2022-09-03 17:13:43


#include <iostream>
#include <cstring>
#include <vector>
#include <array>
using namespace std;
int qq = 0;
const int q = 1;
int const q2 = 10;
const int *b = &qq;
int const *b2 = &qq;
int *const b3 = &qq;

char *getName(char *);
//结构体
struct nameStr {
int a = 0;
};

//枚举
enum Name {
Name_a = 1,
Name_b = 2,
Name_c = 3,
};

//模板类 vector
void vectorV();

//模板类 array
void arrayA();


int main(int argc, const char * argv[]) {


qq = 20;
int qz = 30;
b = &qz;

cout << &b << "地址";

char *name = "sdfffsdfsdflsldfkdkfk**@@lsdkdkdkkkf;;\"\"";
name = getName(name);
//1、释放内存
delete [] name;


//2、C++ 枚举
Name n;
n = Name_b;
switch (n) {
case Name_a:
;
break;

case Name_b:
;
break;

case Name_c:
;
break;
default:
break;
}


//3、模板类vector
vectorV();


//4、模板类array
arrayA();




return 0;
}


void vectorV()
{
//模板类替代动态数组,delete和new都是自动完成
//类似于string类,也是一种动态数组。您可以在运行阶段设置vector对象的长度,可在 末尾附加新数据,'还可在中间插入新数据。基本上,它是使用new创建动态数组的替代品
//缺点:效率比动态数组稍差
//优点:功能强大

//初始化一个0长度的整型数组
vector<int> vi;

//初始化一个固定长度双精度数组
int num = 2;
vector<double> vd(num); //vd(x) x可以是常量也可以是变量,代表数组元素个数


}



void arrayA()
{
//和vector不一样,不能使用变量作为 array<int,num> 的元素个数
int num = 5;

//*****初始化
//一个包含5个无初始值整型元素的数组
array<float, 4> ari;

//一个包含4个浮点型元素的数组
array<float, 4> arf = {1.0f,2.3,4.0,20};

//两个array赋值,只有相同元素个数和属性才可以
ari = arf;


//*****成员函数 at() 替换下标元素
ari.at(1) = 222;
ari[1] = 333; //简化替换模式


//*****成员函数 data()
char q = 'a';
char q2[] = {"sdfsdf"};
char q3[] = {"uuueeo"};

char *ac = q2;
char *bc = q3;

array<char *, 2> arc = {ac,bc};
array<char , 4> arc2 = {'a','c','d','f'};

char **c = arc.data();
char *c2 = arc2.data();
cout << c+1 << "sdf" << endl;

//data操作
const array<float,6>array3={34,23,45,12,22,56};
array<float,6>array2;
memcpy(array2.data(),array3.data(),sizeof(float)*4);


//*****成员函数 begin() end() 用于迭代器
auto begin = ari.begin(); //首地址
float *end = ari.end(); //结束地址


//*****遍历元素
//顺序遍历
for (auto i = begin; i!=end; i++) { //循环数组元素
cout << *i << "i\n";
}

for (float& x : ari) //类型似于OC的 for in快速枚举
{
cout << "x=" << x << endl;
}

//逆序遍历
for (auto i = ari.rbegin(); i != ari.rend(); i++) {
cout << "i=" << *i << endl;
}

for (auto i = ari.crbegin(); i != ari.crend(); i++) {
cout << "conts不可变=" << *i << endl;
}


//*****成员函数 front back size
cout<<ari.front()<<endl; //输出第一个元素
cout<<ari.back()<<endl; //输出最后一个元素
cout<<"size is :"<<ari.size()<<endl; //输出大小
cout<<"max size is:"<<ari.max_size()<<endl;
cout<<endl;

}


char *getName(char *name)
{
//根据输入内容大小分配内存
char *newName = new char[strlen(name)+1];
strcpy(newName, name);

return newName;
}