模板
返回值可以使任意类型
泛型编程的基础
模板函数
template <typename T>
T func(T number1, T number2){
return number1 + number2;
}
模板类
template <class T>
class MyTemp{
public:
MyTemp(T a, T b){
this->a = a;
this->b = b;
}
T a;
T b;
};
/*实例化模板类对象时,要确定模板类的数据类型*/
STL(容器、算法、迭代器)
STL容器
顺序容器
vector(向量)//动态数组
list(列表)//双向链表
关联容器
vector容器(动态数组)
特点
动态扩展:找到比原空间更大的空间,拷贝原空间内容,释放原空间//效率较慢
vector数据存储在堆上
注意:释放空间
vector<int> v_int; //创建vector容器
v_int.push_back(100);//在容器尾部添加元素
v_int.emplace_back(100);//在容器尾部添加元素
/*
·推荐使用emplace_back();效率更高
·push_back会调用拷贝构造函数,emplace_back直接在尾部添加
*/
v_int.pop_back(); //删除最后一个元素
v_int.size(); //返回容器大小(元素个数)
v_int.front(); //返回首元素
v_int.back(); //返回尾元素
vector容器遍历
at(): v_int.at(index);
数组下标:v_int[index];
迭代器
在容器中的作用类似于指针
vector<int>::iterator it;//创建迭代器
v_int.begin(); //返回首元素地址
v_int.rbegin(); //返回尾元素地址
v_int.end(); //返回尾元素的下一块区域的地址
v_int.rend(); //返回首元素的前一块区域的地址
v_int.insert(it,100);//在迭代器指向的空间插入元素
/*
·插入操作后原有的迭代器均不能继续使用
*/
v_int.erase(it);//删除迭代器指向的空间的元素
/*
·erase方法删除数据不影响迭代器
*/
容器的大小、容量
v_int.reserve(10);//改变容器的容量
/*
·容量大小会随容器的大小(元素个数)增加而扩容
*/
v_int.capacity();//打印容器的容量
swap(v1,v2); //交换两个容器
v1.swap(v2); //交换两个容器
/*
vector<int>(v1).swap(v1);
·巧用swap方法释放多余的容量
·创建新容器拷贝旧容器
·新容器和旧容器交换
*/
vector的排序
algoriithm库下sort方法
list容器(双向链表)
将数据进行链式存储
迭代器只能前移或者后移
list插入数据迭代器不受影响
list容器的反转和排序
l1.reverse();//反转链表
l1.sort(); //排序
map、multimap容器(键值对容器)
map容器的所有元素都是pair对组
不允许有重复的键值 ,multimap可以有重复的键值
只能通过insert插入对象
插入的数据自动排序
/*
map容器在底层是由二叉树实现的
map容器是高性能的
*/
m.erase(key);//通过键值来删除数据
//通过迭代器和find函数来查找数据
m.count(key);//multimap统计重复的key的元素个数
pair对组容器
用来存储成对出现的数据
创建:pair<int, string> p1(1001,"abc");
第一个元素为键(查找),第二个元素为值(存储)
其他容器
array(数组容器)
deque(双向数组)
stack(栈容器)
queue(队列容器)
set (自动排序容器)