C++:线上课程2_25(菱形继承,STL)

本文详细介绍了C++中的菱形继承,包括SGI STL的背景和特性,以及C++子集的引用类型。此外,还探讨了虚继承中的构建对象顺序。同时,对STL库进行了概述,讲解了其发展历程和主要组成部分,如容器、迭代器、算法、仿函数和配置器,并提供了相关代码示例进行说明。
摘要由CSDN通过智能技术生成


一、 菱形继承

1. SGI STL

Stepanov在离开HP之后,就加入到了SGI 公司,并和Matt Austern等人开发了SGI STL。严格意义上来说,它是 HP STL 的一个继承版本。和 HP STL一样,SGI STL也是开源的,其源代码的可读性可非常好,并且任何人都可以修改和销售它。

注意,和STL官方版本来说,SGI STL只能算是一个“民间”版本,因此并不是所有支持C++的编译器都支持使用SGI STL模板库,唯一能确定的是,GCC (Linux下的C++编译器)是支持的,所以SGl STL在Linux平台上的性能非常出色。

2. C++子集

C++分为 C子集,class类子集,STL子集(标准库),template模板库子集。

#include<iostream>
using namespace std;

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)
{
	cout << std::is_lvalue_reference<T>::value << endl;
}

int main()
{
	int a = 10;
	const int b = 20;
	fac(a);
	fac(b);
	fac(20);
	return 0;
}

代码示例

#include<iostream>
using namespace std;

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;
}

3.虚继承

** 构建对象顺序**

#include<iostream>
using namespace std;

class Object
{
private:
	int value;
public:
	Object(int x = 0) :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) {}
};

在这里插入图片描述

二、 STL库使用

1. 概述

STL是“Standard Template Library”的缩写,中文译为“标准模板库”。STL是C++标准库的一部分,不用单独安装。

C++对模板(Template)支持得很好,STL就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。例如,vector 的底层为顺序表(数组),list 的底层为双向链表,
deque 的底层为循环队列,set 的底层为红黑树,unordered_map (hash_map)的底层为哈希表。

STL的发展和版本

自1998年 ANSI/ISO C++标准正式定案,C++ STL规范版本正式通过以后,由于其实开源的,各个C++编译器厂商在此标准的基础上,实现了满足自己需求的C++STL泛型库,主要包括HP STL、SGI STL、STLport、PJ STL、Rouge Wave STL等。

HP STL(最早)

HP STL是Alexandar Stepanov(STL标准模板库之父,文章后续简称Stepanov)在惠普Palo Alto实验室工作时,与Meng Lee 合作完成的。HP STL是开放源码的,即任何人都可以免费使用、复制、修改、发布和销售该软件以及相关文档,但前提是必须在相关文档中,加入 HP STL版本信息和授权信息。

HP STL 是C++ STL的第一个实现版本,其它版本的C++ STL一般是以HP STL为蓝本实现出来的。不过,现在已经很少直接使用此版本的STL 了。

SGI STL(g++)

Stepanov在离开HP之后,就加入到了SGI 公司,并和Matt Austern等人开发了SGI STL。严格意义上来说,它是 HP STL的一个继承版本。和 HP STL一样,SGI STL也是开源的,其源代码的可读性可非常好,并且任何人都可以修改和销售它。

注意,和STL官方版本来说,SGI STL只能算是一个“民间”版本,因此并不是所有支持C++的编译器都支持使用SGI STL模板库,唯一能确定的是,GCC(Linux 下的C++编译器)是支持的,所以SGI STL在Linux平台上的性能非常出色。

STL port

为了使SGI STL的基本代码都适用于VC++和C++ Builder等多种编译器,俄国人Boris Fomitchev建立了一个free 项目来开发STLport,此版本STL是开放源码的。

PJSTL

PJSTL (全称为 PJ. Plauger STL)是 PJ.Plauger(美国人,1965年毕业于普林斯顿大学,物理专业学士)参照 HP STL实现出来的,也是 HP STL 的一个继承版本,因此该头文件中不仅含有HP STL 的相关授权信息,同时还有P.J.Plauger本人的版权信息。

其实PJSTL是 P.J.Plauger公司的产品,尽管该公司当时只有3个人。PJ STL 被Visual C++编译器所采用,但和PH STL、SGl STL 不同的是,PJ STL 并不是开源。

2.STL内容

STL包含:

1.容器类(container)

各种数据结构,如vector(随机迭代器), list(双向迭代器), deque(随机迭代器), set(双向迭代器),map(双向迭代器)等用来存放数据。

2.迭代子(iterator)

扮演容器于算法之间的胶合剂,是所谓的“泛型指针”,共有五种类型,以及其他衍生变化。从实现交度来看,迭代器是一种将operator*, operator->, operator++, operator–等指针相关操作予以重载的类模板,所有STL容器都附带有自己专属的迭代器,只有容器设计者才知道如何遍历自己的容器中的元素。

3.算法( algorithm)

各种常用算法如sort, search, copy, erase 等等

4.仿函数(functors)

行为类似函数,可做为算法的某种策略,从实现的角度来看,仿函数是一种重载operator()的类或者类模板。

5.配接器(adapters)

一种用来修饰容器或仿函数或迭代器接口的东西。例如,STL提供的stack, queue,虽然看是容器,其实只能算足一种容器配接器,因为他们的底层完全借助deque所有操作都足由底层的deque供应的。

6.配置器(allocators)

负责空间配置于管理

3. 代码示例

#include<iostream>
#include<string> // C++字符串类型库
#include<string.h> //C字符函数库
#include<cstring> // C字符函数库
using namespace std;

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值