1.函数模板语法:
template<typename T>
函数声明或定义
template——声明创建模板
typename——表明其后面的符号是一种数据类型,可以用class代替
T——通用的数据类型,名称可以替换,通常为大写字母
使用函数模板有两种方式:自动类型推导、显示指定类型
注意事项:使用模板时必须确定出通用数据类型T,并且能够推导出一致的类型
2.面向对象包括:封装、继承和多态。
3.STL——Standard Template Library,标准模板库
STL的六大组件:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
4.容器:vector 算法:for_each 迭代器:vector<int>::iterator
5.string中的assign
1) string str;
str.assign(“hello world”); //把hello world赋值给str
2) string str;
str.assign(“hello world”,5); //输出为hello前5个字符赋给str
- string str
str.assign(10,’w’); //输出10个w字符
6.字符串string 拼接符号
1) +=
string str1 = “我”;
str1 += “爱玩游戏”;
cout << "str1 = " << str1 << endl; //输出为: 我爱玩游戏
- append
常规的拼接也可以做,下边2个是特别的记录
//把字符串前n个字符连接到当前字符串结尾
string str3 = “I Love”
str3.append("game abcdef", 4);
cout << "str3 = " << str3 << endl; //输出I Love game
//参数2 从哪个位置开始截取,参数3 截取字符个数
str2 = “ DNF LOL ”;
str3.append(str2, 4, 4);
cout << "str3 = " << str3 << endl;
//接着上边的输出:I Love game LOL
7.字符串string查找和替换
1)查找 find 和 rfind
string str = "abcdefghijk";
int pos = str.find("de");
if (pos == -1)
{
cout << "未找到字符串" << endl;
}
else
{
cout << "找到字符串,pos = " << pos << endl;
}
输出为:找到字符串,pos = 3
2)替换repalce
string str1 = "abcdef";
//从1号位置起,替换3个字符,替换为“1111”
str1.replace(1, 3, "1111");
cout << "str1 = " << str1 << endl;
输出为:a1111ef
8.字符串string比较 replace
string str1 = "abcdef";
string str2 = "abcdef";
int com = str1.compare(str2);
if (com == 0)
{
cout << "两个字符串相等" << endl;
}
else if (com > 0 || com < 0)
{
cout << "两个字符串不相等" << endl;
}
9.字符串string存取——[]和at
//1. 通过[]访问单个字符
string str = "abcdef";
for (int i = 0; i < str.size(); i++)
{
cout << str[i] << " ";
}
cout << endl;
//2. 通过at方式访问单个字符
for (int i = 0; i < str.size(); i++)
{
cout << str.at(i) << " ";
}
cout << endl;
//3. 修改单个字符
str[0] = 'x';
// xbcdef
cout << "str = " << str << endl;
str.at(1) = 'Y';
//xYcdef
cout << "str = " << str << endl;
10.字符串string插入和删除
1)插入——insert
string str = "Hello";
//插入 输出结果:H520llo
str.insert(1, "520");
cout << "str = " << str << endl;
2)删除——erase
//删除 参数1 起始位置, 参数2 删除字符的个数
str.erase(1, 3);
cout << "str = " << str << endl;
11.字符串string子串——substr
string str = "Hello";
string Substr = str.substr(1, 3);
cout << "Substr = " << Substr << endl;
实际操作:
{
string email = "heima@qq.com";
int pos = email.find("@");
cout << "pos = " << pos << endl;
//输出邮箱@前的信息
string username = email.substr(0, pos);
cout << "username = " << username << endl;
}
12.vector
接口:
判断是否为空——empty()
返回元素个数——size()
返回容器容量——capacity()
重新指定大小——resize()
尾插——push_back()
尾删——pop_back()
插入——insert() (位置迭代器)
删除——erase() (位置迭代器)
清空——clear()
用迭代器获取vector容器中元素,v[]和v.at()也可以
v.front()返回容器第一个元素
v.back()返回容器最后一个元素
交换容器中的元素——swap()
利用swap可以收缩内存空间 vector<int>(v).swap(v);
排序——sort(v.begin(),v.end()); //默认升序
预留空间——reserve()
数据量比较大时,可以利用reserve来预留空间
13.deque容器
接口:
判断是否为空——empty()
返回元素个数——size()
重新指定大小——resize()
*deque没有容量这个概念
尾插——push_back()
头插——push_front()
尾删——pop_back()
头删——pop_front()
插入——insert() (位置迭代器)
删除——erase() (位置迭代器)
清空——clear()
排序——sort(d.begin(),d.end());
14.stack容器 栈
符合先进后出,栈没有遍历行为
返回栈顶——top
入栈——push
出栈——pop
判断栈是否为空——empty
返回栈大小——size
15.queue容器 队列
符合先进先出,只有队头和队尾才能被外界访问,因此没有遍历行为
入队列——push
出队列——pop
头队列——front
尾队列——back
判断队列是否为空——empty
返回队列大小——size
16.list容器 链表
接口:
判断是否为空——empty()
返回元素个数——size()
重新指定大小——resize()
尾插——push_back()
头插——push_front()
尾删——pop_back()
头删——pop_front()
插入——insert() (位置迭代器)
删除——erase() (位置迭代器)
移除——remove()
清空——clear()
list容器中不可以通过[]或者at()方式访问数据
返回第一个元素——front()
返回最后一个元素——back()
反转——reverse()
L.reverse();
所有不支持随机访问迭代器的容器,不可以用标准算法
不支持随机访问迭代器的容器,内部会提供对应一些算法
sort(L1.begin(),L1.end()); //这种表达就不可以了
可以使用:
升序排列 L.sort();
降序排列 L.sort(myCompare);
bool myCompare(int v1, int v2)
{
return v1 > v2;
}
17.set容器
插入数据——只有s.insert()这一种方式
特点:所有元素插入时候自动被排序,并且不允许插入重复值
接口:
判断是否为空——empty()
返回元素个数——size()
交换两个集合容器——swap() // s1.swap(s2);
记住没有resize这个接口
插入——insert() (位置迭代器)
删除——erase() (位置迭代器) 也可以直接删除例如s.erase(30);
清空——clear()
查找——find() 例如:set<int>:: iterator pos = s1.find(30);
统计——count() 对于set容器而言,统计count不是0就是1
18.multiset容器
与set容器相比,multiset可以插入重复数据
19.map容器
自身按照key值默认排序
map中所有元素都是成对出现,插入数据时候要使用对组
接口:
判断是否为空——empty()
返回元素个数——size()
交换两个集合容器——swap()
插入——insert() (位置迭代器) 记住一种就可以了
//第一种
m.insert(pair<int, int>(1, 10));
//第二种
m.insert(make_pair(2, 20));
删除——erase() (位置迭代器)
清空——clear()
查找——find() 例如:map<int,int>:: iterator pos = m.find(3);
统计——count() 对于map容器而言,统计count不是0就是1
20.算法
1)查找容器中,有没有大于5的数字
class GreaterFive
{
public:
bool operator()(int val)
{
return val > 5;
}
};
vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());
if (it == v.end())
{
cout << "未找到" << endl;
}
else
{
cout << "找到了大于5的数字为:" << *it << endl;
}
2)sort在vector容器中的降序排列
class Compare
{
public:
bool operator()(int val1, int val2)
{
return val1 > val2;
}
};
//可以使用greater<int>() 内建仿函数 头文件#include<functional>
//sort(v.begin(), v.end(), greater<int>());
sort(v.begin(), v.end(), Compare());
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
21.算数仿函数 头文件添加 #include<functional>
取反——negate<T> (一元运算) // negate<int>n; cout << n(10) << endl; 输出为:-10
加法——plus<T> (一下都是二元运算)
减法——minus<T>
乘法——multiplies<T>
除法——divides<T>
取模——modulus<T>
22.关系仿函数 sort(v.begin(), v.end(), greater<int>()); 降序排列
大于 ——greater<T>()
大于等于——greater_equal<T>()
等于——equal_to<T>()
不等于——not_equal<T>()
小于——less<T>()
小于等于——less_equal<T>()
23.逻辑仿函数
逻辑与——logical_and<bool>()
逻辑或——logical_or<bool>()
逻辑非——logical_not<bool>()