IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 菱形继承,STL -> 正文阅读

[数据结构与算法]菱形继承,STL

C++的4个子集

C子集
class子集
STL
template模板
//函数重载参数的类型或者个数不同,在C11里面也可以根据你的作之和右值来判断
void fun(int& a)//左值引用
{
	cout << "fun(int & a)" << endl;
}
void fun(const int& a)//万能引用不管你是左值还是右值
{
	cout << "fun(const int &a)" << endl;
}
void fun(int&& a)//右值引用
{
	cout << "fun(int && a)" << endl;
}
int main()
{
	int a = 10;
	const int b = 20;
	const int& x = b;
	const int& y = 20;
	fun(x);
	fun(y);
	fun(10);
	return 0;
}

在这里插入图片描述
void fun(const int& a)//常引用不管你是左值还是右值都以引用

//函数重载参数的类型或者个数不同,在C11里面也可以根据你的作之和右值来判断
void fun(int& a)//左值引用
{
	cout << "fun(int & a)" << endl;
}
void fun(const int& a)//万能引用不管你是左值还是右值
{
	cout << "fun(const int &a)" << endl;
}
//void fun(int&& a)//右值引用
//{
//	cout << "fun(int && a)" << endl;
//}
int main()
{
	int a = 10;
	const int b = 20;
	const int& x = b;
	const int& y = 20;
	fun(x);
	fun(y);
	fun(10);//首先找右值引用,其次是找常引用函数
	return 0;
}

在这里插入图片描述

void fun(int& a)//左值引用
{
	cout << "fun(int & a)" << endl;
}
void fun(const int& a)//万能引用不管你是左值还是右值
{
	cout << "fun(const int &a)" << endl;
}
void fun(int&& a)//右值引用
{
	cout << "fun(int && a)" << endl;
}
template<class T>
void fac(T&& a)//右值一旦拥有名字将变为左值
{
	fun(a);
}
int main()
{
	int a = 10;
	const int b = 20;
	fac(a);
	fac(b);
	fac(20);
	return 0;
}

在这里插入图片描述

完美转发 std::forward(a)

系统为了避免上述的右值引用的情况产生了新的概念完美转发

void fun(int& a)//左值引用
{
	cout << "fun(int & a)" << endl;
}
void fun(const int& a)//万能引用不管你是左值还是右值
{
	cout << "fun(const int &a)" << endl;
}
void fun(int&& a)//右值引用
{
	cout << "fun(int && a)" << endl;
}
template<class T>
void fac(T&& a)//右值一旦拥有名字将变为左值
{
	//fun(a);
	fun(std::forward<T>(a));
}
int main()
{
	int a = 10;
	const int b = 20;
	fac(a);
	fac(b);
	fac(20);
	return 0;
}

在这里插入图片描述

template<class T>
class Object
{
	T value;
public:
	Object(T x = T()) :value(x) {}
	static int num;
};
template<class T>
int Object<T>::num = 0;
class Base :public Object<int>
{
public: Base() { num += 1; }
	  void Print()const { cout << "Base" << num<<endl; }
};
class Test :public Object<int>
{
public:
	Test() { num += 1; }
	void Print()const { cout << "Test" << num << endl; }
};
int main()
{
	Base b1, b2;
	Test t1, t2;
	b1.Print();
	t1.Print();
	return 0;
}

在这里插入图片描述

template<class T>
class Object
{
	T value;
public:
	Object(T x = T()) :value(x) {}
	static int num;
};
template<class T>
int Object<T>::num = 0;
class Base :public Object<int>
{
public: Base() { num += 1; }
	  void Print()const { cout << "Base" << num<<endl; }
};
class Test :public Object<double>
{
public:
	Test() { num += 1; }
	void Print()const { cout << "Test" << num << endl; }
};
int main()
{
	Base b1, b2;
	Test t1, t2;
	b1.Print();
	t1.Print();
	return 0;
}

在这里插入图片描述

菱形继承

数据冗余导致的不一致性

class Person
{
private:
	string p_id;
	string p_name;
	string p_sex;
	int p_age;
public:
	Person(const string& id, const string& name, const string& sex, int age)
		:p_id(id), p_name(name), p_sex(sex), p_age(age)
	{}
	void print()const
	{
		cout << "id:   " << p_id << endl;
		cout << "name: " << p_name << endl;
		cout << "sex:  " << p_sex << endl;
		cout << "age:  " << p_age << endl;
	}
};
class Student :public Person
{
private:
	string s_id;
public:
	Student(const string& id, const string& name, const string& sex, int age, const string& d)
		:Person(id, name, "男", age), s_id(d)
	{}
};
class Staff :public Person
{
private:
	string s_id;
public:
	Staff(const string& id, const string& name, const string& sex, int age, const string& d)
		:Person(id, name, "女", age), s_id(d)
	{}
};
class Stud_Staff :public Student, public Staff
{
private:
public:
	Stud_Staff(const string& id, const string& name, int age, const string& dd, const string ss)
		:Student(id,name,"男",age,ss),Staff(id,name,"nv",age,dd)
	{

	}
};
int main()
{

	Stud_Staff ss("610431199900000000", "王伟", 23, "20200", "303030");
	ss.Student::print();
	ss.Staff::print();
	Student s1 = ss;
	Staff s2 = ss;
	//Person p = ss;erro因为此类里面有两个人//数据冗余导致的不一致性
	return 0;
}

在这里插入图片描述
在这里插入图片描述

虚继承

class Person
{
private:
	string p_id;
	string p_name;
	string p_sex;
	int p_age;
public:
	Person(const string& id, const string& name, const string& sex, int age)
		:p_id(id), p_name(name), p_sex(sex), p_age(age)
	{}
	void print()const
	{
		cout << "id:   " << p_id << endl;
		cout << "name: " << p_name << endl;
		cout << "sex:  " << p_sex << endl;
		cout << "age:  " << p_age << endl;
	}
};
class Student : virtual public Person
{
private:
	string s_id;
public:
	Student(const string& id, const string& name, const string& sex, int age, const string& d)
		:Person(id, name, "男", age), s_id(d)
	{}
};
class Staff :virtual public Person
{
private:
	string s_id;
public:
	Staff(const string& id, const string& name, const string& sex, int age, const string& d)
		:Person(id, name, "女", age), s_id(d)
	{}
};
class Stud_Staff :public Student, public Staff
{
private:
	int num = 10;
public:
	Stud_Staff(const string& id, const string& name, int age, const string& dd, const string ss)
		:Student(id,name,"男",age,ss),Staff(id,name,"女",age,dd)
	,Person("61010","yhping","男",23)
	{
	}
};
int main()
{

	Stud_Staff ss("610431199900000000", "王伟", 23, "20200", "303030");
	ss.Student::print();
	ss.Staff::print();
	Student s1 = ss;
	Staff s2 = ss;
	Person p = ss;
	return 0;
}

在这里插入图片描述

class Object
{
	int value;
public:
	Object(int x = 10) :value(x) {}
 };
class Base :virtual public Object
{
	int num;
public:
	Base(int x = 0) :num(x), Object(x + 10) {}
};
class Test :virtual public Object
{
	int sum;
public:
	Test(int x = 0) :sum(x), Object(x + 10) {}
};
class Det :public Base, public Test
{
private:
	int total;
public:
	Det(int x = 0) :total(x), Base(x + 10), Test(x + 20), Object(x + 100) {}
};
int main()
{
	Det d(0);
	return 0;
}

在这里插入图片描述

菱形继承的多继承

class Object
{
	int value;
public:
	Object(int x = 10) :value(x) {}
	virtual void fun() { cout << "Object" << endl; }
	virtual void add() { cout << "Object::add" << endl; }
 };
class Base :public Object
{
	int num;
public:
	Base(int x = 0) :num(x), Object(x + 10) {}
	virtual void fun() { cout << "Base" << endl; }
};
class Test : public Object
{
	int sum;
public:
	Test(int x = 0) :sum(x), Object(x + 10) {}
	virtual void fun() { cout << "Test" << endl; }
	 void add() { cout << "Test::add" << endl; }
};
class Det :public Base, public Test
{
private:
	int total;
public:
	Det(int x = 0) :total(x), Base(x + 10), Test(x + 20) {}
	 void fun() { cout << "Det" << endl; }
	void add() { cout << "Det::add" << endl; }
};
int main()
{
	Det d(0);
	//Object* op = &d;erro因为d里面Base和Test都有Object
	Object* opa = (Base*)&d;
	Object* opb = (Test*)&d;//opa和opb 是不同的地址
	opa->add();
	opa->fun();

	opb->add();
	opb->fun();
	return 0;
}

在这里插入图片描述

在这里插入图片描述

虚继承的多继承

class Object
{
	int value;
public:
	Object(int x = 10) :value(x) {}
	virtual void fun() { cout << "Object" << endl; }
	virtual void add() { cout << "Object::add" << endl; }
 };
class Base :virtual public Object
{
	int num;
public:
	Base(int x = 0) :num(x), Object(x + 10) {}
	virtual void fun() { cout << "Base" << endl; }
};
class Test : virtual public Object
{
	int sum;
public:
	Test(int x = 0) : sum(x), Object(x + 10) {}
	virtual void fun() { cout << "Test" << endl; }
	 void add() { cout << "Test::add" << endl; }
};
class Det :public Base, public Test
{
private:
	int total;
public:
	Det(int x = 0) :total(x), Base(x + 10), Test(x + 20), Object(x + 100) {}
	 void fun() { cout << "Det" << endl; }
	void add() { cout << "Det::add" << endl; }
};
int main()
{
	Det d(0);
	Object* opa = &d;
	Object* opb = &d;//opa和opb 是不同的地址
	opa->add();
	opa->fun();

	opb->add();
	opb->fun();
	return 0;
}

在这里插入图片描述

STL

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

STL问的最多的就是配置器和迭代器的失效问题
在这里插入图片描述

字符串库

#include<string>//c++里面的字符串类型
#include<string.h>//C库里面的字符串函数库
#include<cstring>//C库里面的字符串函数库
int main()
{
	string s1 = "yhpingll";
	string s2("yhpingll");
	//string::value_type p;
	string::value_type v;//char v
	string::pointer p = &v;
	string::reference x = v;
	//char&x=v;
	string::const_reference y = v;
	//char const&y=v;

	cout << typeid(p).name() << endl;

}
int main()
{
	string s1 = "abcdefgh";
	string::iterator it = s1.begin();
	for (;it != s1.end(); ++it)
	{
		cout << *it;
	}
	cout << endl;
	string::reverse_iterator rt;
	for (rt = s1.rbegin(); rt != s1.rend(); ++rt)
	{
		cout << *rt;
	}
	cout << endl;
	for (auto& x : s1)
	{
		cout << x;
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

int main()
{
	string s1("yhping");
	string s2("hello");
	cout << s1 << endl;
	cout << s2 << endl;
	s1 = s2;
	cout << s1 << endl;//底层已经对输出流进行了重载
	cout << s2 << endl;
}

在这里插入图片描述

int main()
{
	string s1("yhping");
	string s2("hello");
	cout << s1 << endl;
	cout << s2 << endl;
	s1 = std::move(s2);
	cout << s1 << endl;//底层已经对输出流进行了重载
	cout << s2 << endl;
}

在这里插入图片描述

#include<string>//c++里面的字符串类型
int main()
{
	string s1("yhping");
	cout << "size: " << s1.size() << endl;
	cout << "capacity: " << s1.capacity() << endl;
	s1 += "hellohelloniahoanihaoa";
	cout << "size: " << s1.size() << endl;
	cout << "capacity: " << s1.capacity() << endl;
	return 0;
}

在这里插入图片描述

int main()
{
	string s1("yhping");
	int n = s1.size();
	for (int i = 0; i < n; ++i)
	{//下标访问
		cout << s1[i] << " ";
	}
	cout << endl;
	//在某些STL库里面[]访问并不检查是否越界,函数检查是否越界
	for (int i = 0; i < n; ++i)
	{//函数访问
		cout << s1.at(i) << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

int main()
{
	string s1("yhping");
	char cha = s1[1];

	char& chb = s1[1];//一般情况下不要以引用接收

	s1.clear();//清除函数
	s1 = "hello";
	cout << chb << endl;

	return 0;
}

在这里插入图片描述

int main()
{
	string s1("yhping");
	cout << "size: " << s1.size() << endl;
	cout << "Capt: " << s1.capacity() << endl;
	cout << "max_size: "<<s1.max_size() <<endl;
	s1.reserve(128);
	cout << "size: " << s1.size() << endl;
	cout << "Capt: " << s1.capacity() << endl;
	cout << "max_size: " << s1.max_size() << endl;
}

在这里插入图片描述

int main()
{

	string s1("yhping");
	cout << s1.size() << " " << s1.capacity() << endl;
	s1.reserve(200);//正常情况每一次空间不够的时候扩容,我们现在直接一次性给200个字节空间,不需要反复的对空间进行操作
	for (int i = 0; i < 10; ++i)
	{
		s1 += "hello";
		cout << s1.size() << " " << s1.capacity() << endl;
	}
}

在这里插入图片描述

#include<vector>
class Object
{
private:
	int value;
public:
	Object(int x = 0) :value(x) { cout << "Object" << endl; }
	Object(const Object& obj) :value(obj.value) { cout << "Object &" << endl; }
	Object(Object&& obj) :value(obj.value) { cout << "move Object&&" << endl; }
	Object& operator=(const Object& obj)
	{
		value = obj.value;
		cout << "operator=" << endl;
		return *this;
	}
	Object& operator=(const Object&& obj)
	{
		value = obj.value;
		cout << "operator=" << endl;
		return *this;
	}
	~Object()
	{
		cout << "~Object" << endl;
	}
};
int main()
{
	vector<Object> vecobj;

	for (int i = 0; i < 5; ++i)
	{
		vecobj.push_back(Object(10));
		cout << vecobj.size() << endl;
		cout << vecobj.capacity() << endl;
	}
	return 0;
}

反复的扩容导致产生更多的构造和析构函数并且产生了更多的对象
增空间将原来的对象挪到新空间,在释放原来的旧空间
在这里插入图片描述

int main()
{
	vector<Object> vecobj;
	vecobj.reserve(200);
	for (int i = 0; i < 5; ++i)
	{
		vecobj.push_back(Object(10));
		cout << vecobj.size() << endl;
		cout << vecobj.capacity() << endl;
	}
	return 0;
}

在这里插入图片描述

随机性迭代器和双向迭代器的区别

int main()
{
	vector<int>ivec = { 12,2,3,34,45 };
	//随机性迭代器
	vector<int>::iterator it = ivec.begin();
	it++;
	it += 5;
	list<int>ilist = { 12,2,3,34,45 };
	//双向迭代器
	list<int>::iterator i = ilist.begin();
	i++;
	i += 5;//Erro链表不能
	return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:50:35  更:2022-03-30 18:54:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:27:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码