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