有序容器自主定义排序器

STL中的set和map是有序容器,使用时如果希望根据自己的需要来设定排序器,通常有一下两种方式。

1.如果容器中直接存储对象的话,那么我们可以在对象类中重载<即可,内置类型的话就不需要了,因为有默认的

2.如果存储的不是直接对象的话比如对象的指针(通常为智能指针),这个时候我们就要定义自己的比较器。而比较器的写法一般有两种。

->1.类内重载函数调用运算符的方法。

->2.以函数的方式提供比较器。

对于第一种方法是非常简单而且经常用的,这里不再赘述。

下面主要以一个简单的例子来介绍第二种方法中比较器的两种写法(这里为了方便说明,暂时存储对象)。

student.h

class Student{
public:
	Student(const string &sid) : id(sid){}

	void print()const{
		cout << id << endl;
	}

	string getId()const{
		return id;
	}

private:
	string id;
};

main.cpp

struct Compare{
	//override the operator ()
	bool operator()(const Student &ls, const Student &rs)const{
		return ls.getId() < rs.getId();
	}
};

bool compare(const Student &ls, const Student &rs){
	return ls.getId() < rs.getId();
}

int main(){
	/*the first type-----define a class as the comparator*/
	set<Student, Compare> ms;

	ms.insert(Student("222"));
	ms.insert(Student("111"));
	ms.insert(Student("333"));

	auto ite = ms.begin();

	for (; ite != ms.end(); ++ite){
		ite->print();
	}

	/*the second type----define a function as the comparator*/
	/*
	set<Student, bool (*)(const Student &ls, const Student &rs)> ms(compare);

	ms.insert(Student("222"));
	ms.insert(Student("111"));
	ms.insert(Student("333"));

	auto ite = ms.begin();

	for (; ite != ms.end(); ++ite){
		ite->print();
	}
	*/
	return 0;
}

有序容器自主定义排序器,布布扣,bubuko.com

时间: 2024-08-26 13:25:14

有序容器自主定义排序器的相关文章

SSIS【Foreach 循环容器_Foreach 文件枚举器】(导入路径下的所有txt文件的内容) (转)

原文:http://blog.csdn.net/kk185800961/article/details/12276449 SQLServer 2008 R2 SSIS_Foreach 循环容器_Foreach 文件枚举器(导入路径下的所有txt文件的内容) 1. 拖动一个 [Foreach 循环容器]到[控制流]中,再拖动一个[数据流任务]到[Foreach 循环容器]中.如图: 2.编辑[Foreach 循环容器],在选项[集合]中选择[Foreach 文件枚举器],配置要遍历的文件夹及文件类

ie浏览器和火狐浏览器对对容器宽度定义的差异

首先我们说说firefox和IE对CSS的宽度显示有什么不同: 其实CSS ’width’ 指的是标准CSS中所指的width的宽度,在firefox中的宽度就是这个宽度.它只包含容器中内容的宽度.而Internet Explorer ’width’则是指整个容器的宽度,包括内容,padding ,border. Firefox中:容器占的宽度=内容宽度+padding宽度+border宽度 IE中:内容宽度=您定义的容器宽度(Internet Explorer ’width’)-padding

Struts2自己定义拦截器实例—登陆权限验证

版本号:struts2.1.6 此实例实现功能:用户须要指定username登陆,登陆成功进入对应页面运行操作,否则返回到登陆页面进行登陆,当直接訪问操作页面(登陆后才干訪问的页面)时则不同意,须返回登陆页面. 代码例如以下: 一.页面 login.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUB

Struct2_定义拦截器并使用注解方式作用在Action的方法中

一.目的:通过在方法上加注解控制哪些方法需要登陆后才能访问 二.方式:利用拦截器判断用户是否登陆   三.实现步骤 定义配置文件struts.xml添加节点 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <package name="custom-default" extends="struts-default">         <interceptors>             &

ios之过滤器,排序器

NSPredicate(谓词,作为过滤器使用) 过滤器的意思就是在一组数据中通过数组中元素的某个属性的值是多少,从而过滤出数组中这个值为多少的数组元素组.下面通过代码来说明一下吧 NSPredicate *p = [NSPredicate predicateWithFormat: @"selected == YES"]; // 通过selected属性来作为过滤的条件 NSArray *selectedArray = [self.canDetailDataArray filteredA

自己定义验证器——用Struts2框架以框架师的思维灵活做好该事情

面对的问题:自己定义一个18位身份验证器.编写验证器.在validators.xml文件里进行注冊.在验证配置文件里使用? 第一部分:理解Struts2中自带的验证器 第二部分:如何通过server(后台).再次对前台的数据进行验证 第三部分:用Struts2来自己定义验证器(问题解决方式) 第一部分:理解Struts2中自带的验证器 Struts2框架中自带的后台server验证分为两种:声明式验证和编程式验证 u  声明式验证(重点) ?  对哪个 Action 或 Model 的那个字段进

汉字转拼音,中文拼音排序器

汉字转拼音 NSMutableString *ms = [[NSMutableString alloc] initWithString:@"我是中国人"]; if (CFStringTransform((__bridge CFMutableStringRef)ms, 0, kCFStringTransformMandarinLatin, NO)) { NSLog(@"Pingying: %@", ms); // wǒ shì zhōng guó rén } if (

力所能及之struts2 拦截器定义的包不同是不是也要在其他包定义拦截器

小狼的定义拦截器拦截非登陆用户操作,但是我的action分别在不同的package中,是不是我的拦截器必须要在每个package中都要定义呢? 可不可以定义一个公用的? 这是必须的. <package name="default" extends="struts-default" namespace="/"> <interceptors> <interceptor name="custom" cl

STL容器——对map排序

STL容器(三)——对map排序 对于map的排序问题,主要分为两部分:根据key排序:根据value排序.下面我们就分别说一下~ 1. 根据key进行排序 map默认按照key进行升序排序 ,和输入的顺序无关.如果是int/double等数值型为key,那么就按照大小排列:如果是string类型,那么就按照字符串的字典序进行排列~ (还记得之前说过的字典序吗?当时我们用到了next_permutation这个库函数!)下面我们展示一个例子,说明map中默认按照key升序排列 的情况. Exam