13.C++STL容器(一)

  1. 定长数组array

    #include <iostream>
    #include <string>
    #include <array>
    using namespace std;
    
    class Student {
    public:
    	Student() = default;
    	Student(string name , int stuNum ) :name(name), stuNum(stuNum) {}
    	void print() {
    		cout << name << " " << stuNum << endl;
    	}
    	friend ostream& operator<<(ostream& out, Student& stu) {
    		out << stu.name << " " << stu.stuNum;
    		return out;
    	}
    protected:
    	string name;
    	int stuNum;
    private:
    };
    
    
    int main() {
    	//创建定长数组 array<存储的类型,元素个数> arrname;
    	array<int, 5> arr;
    	array<string, 5>* pArr = new array<string, 5>;
    	delete pArr;
    	//常用成员函数
    	cout << arr.size() << endl;
    	cout << arr.empty() << endl;//返回0表示不为空
    	arr.fill(3);//填充所有元素为3
    
    	//创建并初始化
    	//1.容器元素为普通类型数据
    	array<int, 5>arr1 = { 1,2,3,4,5 };
    	//遍历
    	//普通遍历
    	for (int i = 0; i < arr1.size(); i++)
    	{
    		cout << arr1[i] << " ";
    	}
    	cout << endl;
    	//容器的遍历
    	for (int v : arr1)
    	{
    		cout << v << " ";
    	}
    	cout << endl;
    	//交换
    	array<int, 5>arr2 = { 7,8,9,10,11 };
    	arr1.swap(arr2);
    	for (int v : arr1)
    	{
    		cout << v << " ";
    	}
    	cout << endl;
    	for (int v : arr2)
    	{
    		cout << v << " ";
    	}
    	cout << endl;
    	//2.容器元素为自定义类型数据
    	array<Student, 3>stuArray;
    	for (int i = 0; i < stuArray.size(); i++)
    	{
    		string name = "name";
    		stuArray[i] = Student(name + to_string(i), 18 + i);
    	}
    	for (Student v : stuArray)
    	{
    		//cout << v << endl;
    		v.print();
    	}
    	//迭代器
    	//对象模仿指针,*迭代器是取值运算
    	array<Student, 3>::iterator iter;
    	//begin():第一个元素
    	//end(): 最后一个位置,不是最后元素的位置
    	stuArray.begin()->print();
    	(*stuArray.begin()).print();
    	//stuArray.end()->print(); //访问越界
    	(stuArray.end() - 1)->print();//最后一个元素
    	//迭代器遍历
    	for (iter = stuArray.begin(); iter != stuArray.end(); iter++)
    	{
    		//(*iter).print();
    		//iter->print();
    		cout << *iter << " ";
    	}
    
    	return 0;
    }

  2. 动态数组Vector

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    class Student
    {
    public:
    	Student() = default;
    	Student(string name,int stuNum):name(name),stuNum(stuNum){}
    	void print() {
    		cout << name << " " << stuNum << endl;
    	}
    	//ostream& operator<<(ostream& out) {
    	//	out << this->name << " " << this->stuNum << " ";
    	//	return out;
    	//}	
    	friend ostream& operator<<(ostream& out,Student&stu) {
    		out << stu.name << " " << stu.stuNum;
    		return out;
    	}
    protected:
    	string name;
    	int stuNum;
    private:
    };
    
    template<class _type>
    void printVector(vector<_type> object) {
    	for (_type v:object)
    	{
    		cout << v << " ";
    	}
    	cout << endl;
    }
    
    int main() {
    	//1.容器中的元素为普通类型的数据
    	//不带长度的创建方式
    	vector<int>numVec1;
    	for (int i=0;i<5;i++)
    	{
    		//只能用成员函数做插入元素
    		numVec1.push_back(i);//尾插法
    	}
    	printVector(numVec1);
    
    	//带长度创建
    	vector<string>stuList(3);//当前动态数组的长度是3
    	for (int i=0;i<3;i++)//只有在确定长度范围以内的可以直接采用数组法插入
    	{
    		string name = "name";
    		stuList[i] = name + to_string(i);
    	}
    	printVector(stuList);
    	//超过的必须用成员函数插入
    	stuList.push_back("张三");
    	printVector(stuList);
    
    	//关于push_back
    	vector<int>numVec2(5);
    	numVec2.push_back(333);//在原来内存的后面扩增
    	printVector(numVec2);//0 0 0 0 0 333
    
    	//带初始化
    	vector<int> numVec3 = { 0,1,2,3,4,5 };
    	cout << numVec3.size() << endl;//当前容器中的元素个数
    	cout << numVec3.empty()<< endl;//判断是否为空 
    	cout << numVec3.front()<< endl;//访问第一个元素
    	cout << numVec3.back()<< endl;//访问最后一个元素
    	cout << numVec3.at(2) << endl;//访问下标为2的元素
    	numVec3.emplace(numVec3.begin()+3, 10);//修改下标为3的元素为10
    	numVec3.emplace(numVec3.end() - 2, 55);
    	numVec3.emplace_back(185); //和push_back一样的功能
    	printVector(numVec3);
    
    	//批量复制
    	int array1[5] = { 1,5,3,78,8 };
    	vector<int>arrayCopy;
    	arrayCopy.assign(array1+2, array1 + 5);//起始位置和结束位置
    	printVector(arrayCopy);
    
    	//2.容器中的元素为自定义类型
    	vector<Student> stu;
    	for (int i=0;i<3;i++)
    	{
    		string name = "name";
    		stu.push_back(Student(name + to_string(i), 18 + i));
    	}
    	printVector(stu);
    	//迭代器
    	vector<Student>::iterator iter;
    	for (iter=stu.begin();iter!=stu.end();iter++)
    	{
    		cout << *iter << "  ";
    	}
    
    	return 0;
    }

  3. array与Vector嵌套

    ​
    #include<iostream>
    #include <string>
    #include <vector>
    #include <array>
    using namespace std;
    
    
    int main() {
    	//array与array嵌套
    	array<array<int, 4>, 3>arr;//三行四列二维数组 arr[3][4]
    	for (int i = 0; i < 3; i++)
    	{
    		for (int j = 0; j < 4; j++)
    		{
    			arr[i][j] = i * j;
    		}	
    	}
    	for (int i = 0; i < arr.size(); i++)
    	{
    		for (int j = 0; j < arr[i].size(); j++)
    		{
    			cout << arr[i][j] << " ";
    		}
    		cout << endl;
    	}
    	cout << endl;
    	//vector与vector嵌套
    	vector<vector<int>>vecData;//一般vecotor 采用的是push_back插入
    	for (int i=0;i<3;i++)
    	{
    		vector<int>temp;
    		for (int j=0;j<4;j++)
    		{
    			temp.push_back(i * j);
    		}
    		vecData.push_back(temp);
    	}
    	for (int i=0;i<vecData.size();i++)
    	{
    		for (int j=0;j<vecData[i].size();j++)
    		{
    			cout << vecData[i][j]<<" ";
    		}
    		cout << endl;
    	}
    	cout << endl;
    
    	//vector与array嵌套
    	array<vector<int>, 3>arrVec;
    	vector<int>inVec[3] = { {3,8,7,8} ,{1,2,4,4,4,5,6} ,{7,8} };
    	for (int i=0;i<3;i++)
    	{
    		arrVec[i] = inVec[i];
    	}
    	for (int i=0;i<arrVec.size();i++)
    	{
    		for (int j=0;j<arrVec[i].size();j++)
    		{
    			cout << arrVec[i][j] << " ";
    		}
    		cout << endl;
    	}
    	cout << endl;
    
    	vector<array<int, 4>> vecArr;
    	array<int, 4>inArr[3] = { {3,8,7,8} ,{1,2,4,4} ,{7,8,1,2} };
    	for (int i=0;i<3;i++)
    	{
    		vecArr.push_back(inArr[i]);
    	}
    	for (int i=0;i<vecArr.size();i++)
    	{
    		for (int j=0;j<vecArr[i].size();j++)
    		{
    			cout << vecArr[i][j] << " ";
    		}
    		cout << endl;
    	}
    	return 0;
    }
    
    ​

  4. 自定义array类

    #include <iostream>
    #include <string>
    using namespace std;
    
    template<class _type,size_t size>
    class MyArray {
    public:
    	MyArray() {
    		Array = new _type[size];
    	}
    	_type& operator[](int index){
    		return Array[index];
    	}
    	_type* begin() {
    		return Array;
    	}
    	_type* end() {
    		return Array + size;
    	}
    	~MyArray() {
    		delete []Array;
    		Array = nullptr;
    	}
    	//迭代器 类的对象模仿指针的行为
    	class iterator {
    	public:
    		iterator() = default;
    		iterator(_type pMove):pMove(pMove) {}
    		void operator=(_type*pMove) {
    			this->pMove = pMove;
    		}
    		bool operator!=(_type* pMove) {
    			return this->pMove != pMove;
    		}
    		iterator operator++(int) {
    			this->pMove++;
    			return  *this;
    		}
    		_type operator*() {
    			return pMove[0];
    			return *pMove;
    		}
    	protected:
    		_type* pMove;
    	private:
    	};
    protected:
    	_type* Array;
    private:
    };
    
    int main() {
    	MyArray<int, 3>arr;
    	for (int i=0;i<3;i++)
    	{
    		arr[i] = i;
    	}
    	MyArray<int, 3>::iterator iter;
    	for (iter=arr.begin();iter!=arr.end();iter++)
    	{
    		cout << *iter <<" ";
    	}
    
    	return 0;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值