STL标准模板库(1)

1.模板

模板是实现代码重用的机制的手段,实现类型参数化,就是把类型定义为参数,c++提供两种模板:一种是函数模板,一种是类模板;



2函数模板 比如现在求一个最大


那就要把所有类型的函数都写一遍,或者可以用到模板

template<typename T>
T getMax(T a,T b)
{
	return a>b?a:b;
}
int main()
{
	int Result = getMax(10,20);
	return 0;
}
这样的好处就是一个通用的函数,函数体相同的函数都可以用模板来代替的.

调用函数的时候,系统会根据传入的参数,来决定虚拟的类型,




3类模板

class CMax
{
public:
	CMax(int a,int b)
	{
		m_a = a;
		m_b = b;
	}
	int GetMax()
	{
		return m_a > m_b ?m_a:m_b;
	}


private:
	int m_a;
	int m_b;

};


int main()
{
	CMax max(10,20);
	int result = max.GetMax();



	return 0;


}
上面是一个普通的类,如果要计算不同类型的值,就需要重新去写新函数.
甚至重新去定义一个类,但是逻辑还是一样的,我们需要用到这个类模板.

定义方法 在修饰类名上面添加:template<typenameT> typename可以换成class

然后,把类里涉及到类型的全部更换成T虚拟类型。

实例化类的时候需要指定类型

template<typename T>
class CMax
{
public:
	CMax(T a,T b)
	{
		m_a = a;
		m_b = b;
	}
	T GetMax()
	{
		return m_a > m_b ?m_a:m_b;
	}


private:
	T m_a;
	T m_b;

};


int main()
{
	CMax<int>max(10,20);
	int result = max.GetMax();
	return 0;


}




4容器

容器用来存放和管理一组元素的数据的集合

各种容器数据结构示意图

容器分为序列式容器,还有就是关联式容器。

序列式的容器:就是每个容器的位置取决于这个元素被插入的时期,和元素本事值没有关系。序列式的容器有:vector deque list


关联上元素:元素的位置取决于自定排序的准则,和插入的顺序没有关系,有set,multiset,map,multimap




5.vector容器

vector是将元素置于动态数组中,vector实际上就是一个数组,是一个不断可以增长,赠短的动态的容器,可以随机访问,随机存取他自己的元素, vector尾部增加和移除是非常快速的,但是vector中间或头部我们要插入元素是比较耗时的。


vector对象默认构造

vector采用类模板实现,vector对象的默认形式:vector<T>vecT


vector尾部添加移除操作

push_back()在尾部添加一个元素

pop_back() 移除尾部最后一个元素


vector的数据的读取

at(int)返回索引指向的数据,如果索引越界,抛出 out_of_range异常m可捕获

[]通过数组下标的形式访问,  但是如果索引值越界,会直接报错。

也可以通过这种形式直接去修改(该索引对应数据必须存在)

vec[0]=20;  vec.at(1)=200;

获取第一个元素 vec.front  获取最后一个元素vec.back()

或者是对第一个和最后一个进行赋值操作:vec.front() = 100; vec.back() = 200;




6迭代器

迭代器意义就是一个指向,指向容器里某个元素的地址,不一定是具体的地址,反正就是一个指向,无论是什么容器。跟容器的类型没有任何关系,无论是vector,map.


他是用来遍历STL容器内部,部分或全部的对象,迭代器只从容器当中特定的位置。

就像指针,迭代器提供对容器中对象的访问的方法,并且可定义容器中对象的范围,


7STL里迭代器类别以及常用的类别

a输入迭代器(只读迭代器)从容器中读一个元素,

b正向迭代器 组合输入输出,多次解析一个迭代器指定的位置

c双向迭代器 组合了正向迭代器的功能,还可以通过操作符向后移动位置

d他们实际上就是前一种迭代器的组合,第一种是最基本的迭代器,带三种是第一种和第二种的组合,

e随机访问迭代器,组合双向迭代器的功能,还能向前向后跳过任意一个位置,直接访问容器任意的元素,




8双向迭代器与随机访问迭代器

双向迭代器支持的操作:

it++, ++it  it--  --it  *it   itA=itB (it就是迭代器实例)

list,set,,multiset,map,multimap都支持双向迭代器


随机访问迭代器支持的操作:

在双向迭代器基础上添加:

it-=i,it+=i,it+i{或it=it+i},it[i]

itA<itB, itA<=itB,itA>itB,itA>=itB 的功能

其中Vector,deque支持随机访问迭代器。



9vector与迭代器的配合使用

vec.began()返回容器中第一个元素的迭代器

vec,end()返回容器中最后一个元素的迭代器

vector<int>::iterator it;    声明迭代器

如vector里元素有1,3,5,7,5 

it = vec.began() 此时*it == 1

运行++it或者it++  此时*it==3 前++比后++效率高

前++返回引用,后++返回值

运行it+=2此时it==7

运行it+1 此时*it=9

运行++it  此时it==vec.end()不能在执行it


反向迭代器 把容器里的内容 从尾部遍历到头部

rbeain实际上指向的是最后一个元素, rend是第一个元素之前的

vector<int>::reverse_iterator it = vec.rbegin();
for (;it!=vec.rend(); it++)
{
	cout<<*it <"";
}


只读迭代器

vector<int>::const_iterator   vector<int>::const_reverse_iterator   

他们是只读形式,不会修改容器中的值, 《Effective STL》建议尽量使用iterator 不适用其他三种。


 

10Vector大小

size()返回容器中元素个数   empty判断容器是否为空

resize(int)重新指定容器长度为num   容器边长,则默认值填充新位置

若变短,则末尾超出的长度的元素会被删除。



11vector插入

insert(pso,elem)在pos位置插入一个elem元素的拷贝,返回新数据的位置

insert(pos,n,elem)在pos位置插入n个elem数据,无返回值

insert(pos,begin,end)在pos位置插入[began end]区间的数据,无返回值。




12vector删除

clear 移除容器的所有数据

erase(begain,end)删除区间的数据,返回下一个数据的位置

erase(pos)删除pos位置的数据,返回下一个数据的位置

如vec.begin()+3  就是第四个元素的位置。

	int count[]=  {1,2,3,4,5,6,7,8,9};
	vector<int>vec(count,count+9);
	vector<int>::iterator it;
	it = vec.begin();
	for(;it!=vec.end();it++)// ++自增操作不写在
	{
		if(*it==3)
		{
			//必须要对it赋值 返回下一个数据位置
			//这样才能
			it = vec.erase(it);
		}
	}


 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值