一.vector简介
来自于一个标准库代表的是一个集合的概念和动态数组,可以把若干对象放在里面,但是类型必须是相同的。因此,他也称为容器。使用方法如下:
struct student {
int num;
};
int main()
{
vector<int> vjihe;//表示这个vjihe里面保存的是int数据
vector<student> stulist;
vector<vector<string>> strchuan;//可以但是,不提倡
vector<int*> vjihe2;//也可以装指针,但是不可以放引用
vector<int&> vjihe3;//因为引用不是对象,所以不能方
1.定义和初始化vector对象(空容器)
vector<string> mystr;//创建一个空的容器
mystr.push_back("abcd");//push_back往容器里面放东西
mystr.push_back("def");
return 0;
2.元素拷贝的初始化方式
vector<string> mystr2(mystr);//相当于把mystr中元素拷贝进mystr2
vector<string> mystr3 = mystr;//也起到相同的作用
3.C++11标准中,列表初始化的方法
vector<string>mystr4 = { "aaa","bbb","ccc" };
4.创建指定数量的元素,有元素数量概念的东西,一般都用圆括号
vector<int> ijihe(15, -200);//创建15个int类型的元素,并且每一个元素的值是-200
vector<string> sjihe(5, "Hello");//创建5个string类型的元素,每一个元素都是Hello
vector<int> ijihe2(20);//创建20个int类型的数据,下标从0-19,但是都是0
vector<string> ijihe3(5);//创建5个string类型的数据,都是""
一般()表示元素数量,{}表示元素内容
二.vector对象上的操作
对于vector容器,在我们常见的情况下都是不知道里面有多少个元素,因此我们常常只是创建一个空的容器。
vector<int> ivec;
push_back,用于在容器后追加元素
ivec.push_back(1);
ivec.push_back(2);
for (int i = 3; i < 100; i++)
{
ivec.push_back(i);
}
size 返回容器里有多少个元素
cout << ivec.size() << endl;
clear.用来清空容器中的所有元素
//ivec.clear();
//cout << ivec.size() << endl;
v[n]:用于返回下标中的第n个元素,n是一个下表,表示返回值的位置
cout << ivec[1] << endl;
赋值:
ivec2.push_back(111);//这个时候里面有一个111的值
ivec2 = ivec;//这个时候是把ivec中的100个元素全部给ivec2,此时原本的111这个值被覆盖
ivec2 = { 12,13,14,150 };//此时又被覆盖成了这个数组
cout << ivec2.size() << endl;
==号和!=号,用于判断相等和不相等
两个容器相等,必须是所有元素数量相同,类型相同,对应位置相同。
vector<int> ivec2;
ivec2 = ivec;
if (ivec == ivec2)
{
cout << "ivec==ivec2" << endl;
}
ivec2.push_back(12345);
if (ivec != ivec2)
{
cout << "ivec!=ivec2" << endl;
}
ivec.clear();
ivec2.clear();
if (ivec == ivec2)
{
cout << "ivec==ivec2" << endl;
}
范围for的应用:
vector<int> vecvalue{ 1,2,3,4,5 };
for (auto& vecitem : vecvalue)//对vecvalue起一个别名vecitem,然后引用其中的所有元素,并且用auto自动判断数据类型
{
vecitem *= 2;//扩大一倍变成 2,4,6,8,10
}
for (auto vecitem : vecvalue)
{
cout << vecitem << endl;
}
进一步理解for语句
for (auto& vecitem : vecvalue)
{
vecvalue.push_back(888);//就会导致报错,一定不要这么追加数值,很难查出来
cout << vecitem << endl;//用范围for遍历这些值
}
三.结构回顾,结构属于自定义的数据类型
结构体的定义:
struct student
{
//成员变量
int num;//学号
char name[100];//学生名
};
int main()
{
student student1;//定义结构变量,这里可以省略student1,直接使用student
student1.num = 1001;
strcpy_s(student1.name, sizeof(student1.name), "zhangsan");
cout << student1.num << endl;
cout << student1.name << endl;
调用方法一:
struct student
{
//成员变量
int num;//学号
char name[100];//学生名
};
void func(student tmpstu)//结构变量为形参
{
tmpstu.num = 2000;
strcpy_s(tmpstu.name, sizeof(tmpstu), "who");
}
int main()
{
student student1;//定义结构变量,这里可以省略student1,直接使用student
student1.num = 1001;
strcpy_s(student1.name, sizeof(student1.name), "zhangsan");
cout << student1.num << endl;
cout << student1.name << endl;
func(student1);//效率低,因为实参传递给形参时发生了一个内存内容的复制
cout << student1.num << endl;//值没有被函数改变
cout << student1.name << endl;
上边的调用很慢,可以加引用会增加效率
struct student
{
//成员变量
int num;//学号
char name[100];//学生名
};
void func(student &tmpstu)//形参变为引用
{
tmpstu.num = 2000;
strcpy_s(tmpstu.name, sizeof(tmpstu), "who");
}
int main()
{
student student1;//定义结构变量,这里可以省略student1,直接使用student
student1.num = 1001;
strcpy_s(student1.name, sizeof(student1.name), "zhangsan");
cout << student1.num << endl;
cout << student1.name << endl;
func(student1);//效率低,因为实参传递给形参时发生了一个内存内容的复制
cout << student1.num << endl;//值没有被函数改变
cout << student1.name << endl;
调用方式2,用指向结构体的指针做函数参数
struct student
{
//成员变量
int num;//学号
char name[100];//学生名
};
void func(student *ptmpstu)//用指向结构体的指针做函数参数
{
ptmpstu->num = 2000;
strcpy_s(ptmpstu->name, sizeof(ptmpstu->name), "who");
}
int main()
{
student student1;//定义结构变量,这里可以省略student1,直接使用student
student1.num = 1001;
strcpy_s(student1.name, sizeof(student1.name), "zhangsan");
cout << student1.num << endl;
cout << student1.name << endl;
func(&student1);
cout << student1.num << endl;
而且C++中结构体 不仅可以实现定义成员变量,还可以定义成员函数(在结构体里面直接写函数),如下:
struct student
{
//成员变量
int num;//学号
char name[100];//学生名
void func()//成员函数
{
num++;
return;
}
};
student1.func();//调用成员函数
四.class
里面有三个权限修饰符,public,private,protect
public:用这个修饰符,修饰结构中的成员变量或者是成员函数,那么这些成员函数和成员对象是可以被外界访问的。
private,被这个修饰符修饰的成员函数和成员变量,只有被内部定义的成员函数和成员变量才可以被访问
而且一个类中可以有多个pubilc和private
struct student//public一般可以不加,默认都是公共属性
{
public:
//成员变量
private:
int num;//学号
char name[100];//学生名
void func()//成员函数,也叫方法
{
num++;
return;
}
};
int main()
{
student student1;
student1.num = 1001;
strcpy_s(student1.name, sizeof(student1.name), "zhangsan");
return 0;
.类结构:也是用户自定义的结构类型
我们知道,结构都是struct,类是class
那么结构和类的区别是:
1.在结构中我们把变量叫做结构变量,在类中我们把变量叫做对象,它们都可以表示为一段内存,内存中有一些东西。
2.在结构中,里面的成员函数和成员变量默认的访问权限都是公共属性;在类中,相反默认都是私有属性。
3.而对于继承来说也是同样如此。
五.类的组织(书写规范)
把类的定义代码都写在头文件上(.h)头文件名和类的名相同
类的具体实现代码放在.cpp文件中