C++的各种模板

C++的各种模板

优先队列 #include <\queue>

定义
  1. 默认定义—例如priority_queue d;
    priority_queue<vector, less > pq1;默认递增排序,最大堆
    priority_queue<vector, greater > pq1;递减排序,最小堆

  2. 自定义 priority_queue<int, vector, cmp> q;

struct cmp {     
  operator bool ()(int x, int y)     
  {        
     return x > y;   // x小的优先级高 表示最小堆
     //也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高
  }
};
  1. 自定义结构体:priority_queueq;
struct node {     
  int x, y;     
  friend bool operator < (node a, node b)     
  {         
    return a.x > b.x;    //结构体中,x小的优先级高 表示最小堆
  }
};
操作

empty()    如果队列为空,则返回真
pop()    删除对顶元素,删除第一个元素
push()    加入一个元素
size()     返回优先队列中拥有的元素个数
top()     返回优先队列对顶元素,返回优先队列中有最高优先级的元素

模板 #include <\vector>

定义 例如——vectorE[MAXN]定义了一个图的边

vector<int> a ;                           //声明一个int型向量a
    vector<int> a(10) ;                    //声明一个初始大小为10的向量
    vector<int> a(10, 1) ;                //声明一个初始大小为10且初始值都为1的向量
    vector<int> b(a) ;                      //声明并用向量a初始化向量b
    vector<int> b(a.begin(), a.begin()+3) ;  
    					//将a向量中从第0个到第2个(共3个)作为向量b的初始值
    int n[] = {1, 2, 3, 4, 5} ;
    vector<int> a(n, n+5) ;              //将数组n的前5个元素作为向量a的初值
    vector<int> a(&n[1], &n[4]) ;        //将n[1] - n[4]范围内的元素作为向量a的初值

操作 vector ;

c.clear()       	移除容器中所有数据。
c.empty()         	判断容器是否为空。
c.erase(pos)        	删除pos位置的数据
c.erase(beg,end) 	删除[beg,end)区间的数据
c.front()         	传回第一个数据。
c.insert(pos,elem) 	在pos位置插入一个elem拷贝
c.pop_back()    	删除最后一个数据。
c.push_back(elem) 	在尾部加入一个数据。
c.resize(num)     	重新设置该容器的大小
c.size()         	回容器中实际数据的个数。
c.begin()          	返回指向容器第一个元素的迭代器
c.end()             	返回指向容器最后一个元素的迭代器

函数模板 #include algorithm

sort函数:默认从小到大
自定义结构体排序时,当返回值为1时,参数在前的排序在前
例:算凸包时对排序定义:当满足if条件时返回1,a参数排在b前面
bool cmp(const points &a,const points &b){
    double temp=cross(a,b,point[0]);
    if(temp>0||(temp==0&&dis(a,point[0])<dis(b,point[0])))
        return 1;
    return 0;
}
sort(point+1,point+N,cmp);
 lower_bound( )和upper_bound( )函数
基本用法
  • lower_bound( begin,end,num):
    从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

  • upper_bound( begin,end,num):
    从数组的begin位置到end-1位置二分查找第一个大于num的数字
    例:在分治——路由器安置问题中有运用upper_bound(h+1,h+N+1,h[temp]+d)-h;得到第一个超出路由器范围的地址。

  • greater</type/>()
    计算从大到小排列的数组

自定义
bool compare(type a, type b)
 {return a>b;}
lower_bound(迭代器_1, 迭代器_2, x, compare)
struct cmp_lower	//lower_bound
{
    bool operator  () (int index,int x)
    {
        return l[index]<x;
    }
};
struct cmp_upper		//upper_bound
{
    bool operator  () (int x,int index)
    {
        return x<l[index];
    }
};
reverse()会将区间[beg,end)内的元素全部逆序; 

复数模板 #include /complex

complex<float>、complex<double>、complex<long double>
实数部分real(),虚数部分imag;
complex z = 5.0 + 3i; // z is now complex<double>{5, 3}

map #include map

  • 构造:
    // 定义一个map对象
    map<int, string> mapStudent;
    // 第一种 用insert函數插入pair
    mapStudent.insert(pair<int, string>(000, “student_zero”));
    // 第二种 用insert函数插入value_type数据
    mapStudent.insert(map<int, string>::value_type(001, “student_one”));
    // 第三种 用"array"方式插入
    mapStudent[123] = “student_first”;
    mapStudent[456] = “student_second”;

  • 元素插入:
    m.insert(e);// e是一个pair类型对象
    m.insert(b, e);// b和e分别是迭代器的开始和结束位置
    map中的key是唯一的。
    当使用insert方法插入已经存在的Key值时,不能成功插入,也就是不会覆盖原来的键值;
    而使用[]方式插入已经存在的Key值时,会用新的key-value覆盖原来的值。

  • 排序
    和sort一样,默认是第一个关键字从小到大排,可以修改排序方式;
    从大到小map<string, int, greater > mapStudent;
    修改比较函数:

     struct CmpByKeyLength{  
     	bool operator()(const string& k1, const string& k2) {  
     		return k1.length() < k2.length();  
     	}  
     };
     map<string, int, CmpByKeyLength > mapStudent;  
    

修改结构体内比较运算符:

typedef struct tagStudentInfo  {      
	int iID;      
	string  strName;      
	bool operator < (tagStudentInfo const& r) const {               
		if(iID < r.iID)  return true;          
		if(iID == r.iID) return strName.compare(r.strName) < 0;         
			return false;    
		}  
}StudentInfo;
map<StudentInfo, int>mapStudent;
map的基本操作函数:
     C++ maps是一种关联式容器,包含“关键字/值”对
     begin()         返回指向map头部的迭代器
     clear()        删除所有元素
     count()         返回指定元素出现的次数
     empty()         如果map为空则返回true
     end()           返回指向map末尾的迭代器
     equal_range()   返回特殊条目的迭代器对
     erase()         删除一个元素
     find()          查找一个元素
     get_allocator() 返回map的配置器
     insert()        插入元素
     key_comp()      返回比较元素key的函数
     lower_bound()   返回键值>=给定元素的第一个位置
     max_size()      返回可以容纳的最大元素个数
     rbegin()        返回一个指向map尾部的逆向迭代器
     rend()          返回一个指向map头部的逆向迭代器
     size()          返回map中元素的个数
     swap()           交换两个map
     upper_bound()    返回键值>给定元素的第一个位置
     value_comp()     返回比较元素value的函数

pair #include

pair<T1, T2> p1;            //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。
pair<T1, T2> p1(v1, v2);    //创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,second成员初始化为v2。
make_pair(v1, v2);          // 以v1和v2的值创建一个新的pair对象,其元素类型分别是v1和v2的类型。
p1 < p2;                    // 两个pair对象间的小于运算,其定义遵循字典次序:
如 p1.first < p2.first 或者 !(p2.first < p1.first) && (p1.second < p2.second) 则返回true。
p1 == p2;                  // 如果两个对象的first和second依次相等,则这两个对象相等;该运算使用元素的==操作符。
p1.first;                   // 返回对象p1中名为first的公有数据成员
p1.second;                 // 返回对象p1中名为second的公有数据成员

list #include

list 是顺序容器的一种。list 是一个双向链表。使用 list 需要包含头文件 list。双向链表的每个元素中都有一个指针指向后一个元素,也有一个指针指向前一个元素,list 容器不支持根据下标随机存取元素。
Lst1.assign() 给list赋值
Lst1.back() 返回最后一个元素
Lst1.begin() 返回指向第一个元素的迭代器
Lst1.clear() 删除所有元素
Lst1.empty() 如果list是空的则返回true
Lst1.end() 返回末尾的迭代器
Lst1.erase() 删除一个元素
Lst1.front() 返回第一个元素
Lst1.get_allocator() 返回list的配置器
Lst1.insert() 插入一个元素到list中
Lst1.max_size() 返回list能容纳的最大元素数量
Lst1.merge() 合并两个list
Lst1.pop_back() 删除最后一个元素
Lst1.pop_front() 删除第一个元素
Lst1.push_back() 在list的末尾添加一个元素
Lst1.push_front() 在list的头部添加一个元素
Lst1.rbegin() 返回指向第一个元素的逆向迭代器
Lst1.remove() 从list删除元素
Lst1.remove_if() 按指定条件删除元素
Lst1.rend() 指向list末尾的逆向迭代器
Lst1.resize() 改变list的大小
Lst1.reverse() 把list的元素倒转
Lst1.size() 返回list中的元素个数
Lst1.sort() 给list排序
Lst1.splice() 合并两个list
Lst1.swap() 交换两个list
Lst1.unique() 删除list中重复的元素

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值