首页 > 其他分享 >STL学习

STL学习

时间:2024-10-27 19:43:03浏览次数:1  
标签:real name STL 学习 int Complex other size

手写STL源码

模板

//TemplateDemo
#include<iostream>
using namespace std;
//交换两个变量
void MySwap(int& a, int& b)
{
	int temp = a;
	a = b;
	b = temp;
}
//使用模板--自适应类型生成函数,地址不同
//函数重载和模板函数冲突,优先调用普通函数,或者使用<T>()显示调用
//不支持隐式转换
template<typename T>
void MyTSwap(T& a, T& b)
{
	int temp = a;
	a = b;
	b = temp;
}

int main()
{
	int a = 10;
	int b = 20;
	MyTSwap(a, b);
	MyPrint(a, b);
}

操作符重载

class Complex
{
public:
	double real;
	double image;

	Complex(double real, double image) :real(real), image(image) {}

	Complex Add(Complex& other)
	{
		return Complex(this->real + other.real, this->image + other.real);
	}

	Complex Mulitply(Complex& other)
	{
		double a = this->real;
		double b = this->image;
		double c = other.real;
		double d = other.image;
		return Complex(a * c - b * d, b * c + a * d);
	}

	Complex operator+(Complex& other)
	{
		return Complex(this->real + other.real, this->image + other.real);
	}

	Complex operator*(Complex& other)
	{
		double a = this->real;
		double b = this->image;
		double c = other.real;
		double d = other.image;
		return Complex(a * c - b * d, b * c + a * d);
	}

};
ostream& operator<<(ostream cout,const Complex& other)
{
	cout << other.real << "," << other.image << "i";
	return cout;//链式
}

尝试一个简易vector

image-20241027165906550

#include<iostream>
using namespace std;

template<typename T>
class MyVector
{
public:
	typedef T value;
	typedef T* iterator;
	typedef t& reference;

public:
	MyVector(int len = 0) :v_len(len), v_Data(nullptr), start(nullptr), pos(0)
	{
		if (len > 0)
		{
			//创建数组
			v_Data = new value[len];
			start = v_Data;
		}
	}
	~MyVector()
	{
		delete[]v_Data;
	}
	void push_back(const value& v)
	{
		if (v_len != pos)
		{
			*(start + pos) = v;
			pos++;
		}
		else
		{
			cout << "越界" << endl;
		}

	}
	inline value pop_back()
	{
		--pos;
		return *(start + pos);
	}
	int size()
	{
		return this->v_len;
	}
	iterator begin()
	{
		return this->start;
	}
	iterator end()
	{
		return this->start + pos;
	}
	value& operator[](int n)
	{
		if (n <= pos) 
		{
			return *(start + n);
		}
		else
		{
			cout << "越界" << endl;
		}
	}

protected:
	iterator v_Data;
	iterator start;
	int v_len;
	int pos;

};
template<typename T>
ostream& operator<<(ostream& cout, MyVector<T> vec) 
{
	for (int i = 0; i < vec.size(); i++) 
	{
		vec.push_back(i);
	}
	return cout;
}

int main()
{
	MyVector<int> vec(10);
	for (int i = 0; i < vec.size(); i++) 
	{
		vec.push_back(i);
	}	
	cout << vec << endl;
	for (int i = 0; i < vec.size(); i++) {
		vec[i] = 100;
	}
	cout << vec << endl;
	
	//for (MyVector<int>::iterator it = vec.begin(); it != vec.end(); it++) 
	//{
	//	cout << *it << "," << endl;
	//}
}

引用,move剖析

  • 左值:有名字,在内存中有自己的地址
  • 右值:除了字符串之外的字面值(true nullptr...) 返回类型为非引用的函数调用 算数表达式
  • 左值引用的本质是一个不能变的指针(常量指针),定义时需要初始化
  • 移动语义:std::move() 将左值转换成右值 转移资源--节省内存空间
#include<iostream>
#include <vector>
using namespace std;

class Student
{
public:
	char* name;
	int size;
	Student(int size = 0) :size(size), name(nullptr)
	{
		if (size > 0)
		{
			name = new char[size];
			for (int i = 0; i < size; i++)
			{
				name[i] = 'a';
			}
		}
	}
	//深拷贝,重新开辟空间
	Student(const Student& stu)
	{
		size = stu.size;
		name = new char[size];
		for (int i = 0; i < size; i++)
		{
			name[i] = stu.name[i];
		}
	}
	//浅拷贝 指向同一片内存
	//出现指针悬挂问题--在析构的时候会重复删除同一片空间
	Student(Student& stu)
	{
		size = stu.size;
		name = stu.name;
	}

	Student(Student&& stu)
	{
		size = stu.size;
		name = stu.name;
		stu.name = nullptr;//移动构造,把别人的占为己有,省去重新开辟空间的过程
	}
	~Student() 
	{
		delete name;
	}
};

int main()
{
	vector<Student> school;
	Student stu(7);
	school.push_back(std::move(stu));

}

//目的是返回右值引用
//T&&万能引用
typename<typename T>
typename remove_reference<T>::type&& move(T&& t)
{
	return static_case<typename remove_reference<T>::type&&>(t);//类型转换,将t转换为右值引用
}
//类型萃取
template<typename T>
struct remove_reference<T&&>
{
	typedef T type;
}

template<typename T&>
struct remove_reference<T&&>
{
	typedef T type;
}

template<typename T&&>
struct remove_reference<T&&>
{
	typedef T type;
}

标签:real,name,STL,学习,int,Complex,other,size
From: https://www.cnblogs.com/shuxiu/p/18508818

相关文章

  • DataGridView控件使用学习
    一、DataGridView控件及元素初始化//DataGridView控件初始化publicSystem.Windows.Forms.DataGridViewdataGridView1;this.dataGridView1=newSystem.Windows.Forms.DataGridView();//DataGridView列初始化publicSystem.Windows.Forms.DataGridViewCheckBoxColumnCol......
  • 浦语学习笔记
    官方文档地址:https://github.com/InternLM/Tutorial/tree/camp4/docs/L1/LlamaIndex前置知识检索增强生成(RetrievalAugmentedGeneration,RAG)技术用于更新模型的权重,另一个就是外部的方式,给模型注入格外的上下文或者说外部信息,不改变它的的权重,相较于训练模型更易于实现。通......
  • Linux学习_7
    第六章文件的其他操作命令主要包括文本内容统计(wc),复制移动文件,查找文件,压缩和解压缩,tar归档文本内容统计(wc)wc------用于统计指定文本文件的行数、字数或字节数wc-参数文件名复制移动文件复制文件cp-参数源文件目标文件移动文件mv命令用于剪切或重命名......
  • # 学期(如2024-2025-1) 学号(如:20241402) 《计算机基础与程序设计》第五周学习总结
    学期(如2024-2025-1)学号(如:20241402)《计算机基础与程序设计》第五周学习总结作业信息|这个作业属于哪个课程|<班级的链接>(如2024-2025-1-计算机基础与程序设计)||-- |-- ||这个作业要求在哪里|<作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)||这个作业的目标......
  • 2024-2025-1 20241304 《计算机基础与程序设计》第5周学习总结
    2024-2025-120241304《计算机基础与程序设计》第5周学习总结作业信息|这个作业属于哪个课程|<2024-2025-1-计算机基础与程序设计)|>|-- |-- ||这个作业要求在哪里|<作业要求的链接>(如https://www.cnblogs.com/rocedu/p/9577842.html#WEEK05))||这个作业的目标|<搞清楚本章......
  • #2024-2025-1学号20241309《计算机基础与程序设计》第五周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第五周作业这个作业的目标|作业正文|2024-2025-1学号20241309《计算机基础与程序设计》第五周学习总结教材学习内容总结《计算机科学概论》......
  • 使用Python实现深度学习模型进行智能可再生能源优化
    在现代能源管理中,优化可再生能源的利用是至关重要的。本文将介绍如何使用Python和深度学习技术构建一个智能可再生能源优化模型,并通过代码示例详细说明该过程。引言可再生能源(如太阳能、风能)具有不稳定性和不可预测性。使用深度学习模型可以更好地预测能源生产,并优化能源......
  • 使用Python实现深度学习模型:智能天气预测与气候分析
    在现代科技的推动下,天气预测和气候分析变得越来越智能化和精准。本文将介绍如何使用Python和深度学习技术构建一个智能天气预测与气候分析模型,帮助我们更好地理解和预测天气变化。本文将从数据准备、模型构建、训练与评估等方面进行详细讲解。一、数据准备天气预测模型需......
  • 机器学习中的模型是指什么
    机器学习中的模型是指用于对数据进行预测、分类、聚类或其他任务的一种数学表示或函数。模型是机器学习算法的核心组成部分,它通过对训练数据进行学习来捕捉数据之间的关系和模式,从而在新数据上进行预测或推断。一、机器学习中的模型是指什么机器学习中的模型是指用于对数......
  • 硬件学习篇-噪声的学习
    目录LDO噪声和PSRR噪声类型数据表中的噪声规格哪种规格适合您的应用如何降低LDO噪声?LDO噪声的影响LDO噪声和PSRR低压差线性稳压器(LDO)为调节由较高电压输入产生的输出电压提供了一种简单方法。虽然操作简单,但其自生噪声在很多时候易与电源抑制比(PSRR)混......