c/c++ 标准库 set 自定义关键字类型与比较函数

标准库 set 自定义关键字类型与比较函数

问题:哪些类型可以作为标准库set的关键字类型呢???

答案:

1,任意类型,但是需要额外提供能够比较这种类型的比较函数。

2,这种类型实现了 < 操作。

答案1的详细说明:声明set时,除了给出元素类型外,还需要给出一个比较函数的类型,注意是类型,不是变量

方式1:使用decltype,注意后面必须有*

multiset<Book, decltype(compareIsbn)*> bookstore(compareIsbn);//compareIsbn是实际存在的函数名

方式2:直接使用函数指针

multiset<Book, bool (*)(const Book &, const Book &)> bookstore(compareIsbn);//compareIsbn是实际存在的函数名

代码块索引:

代码块 功能描述
test1 对应上面的答案1
test2 对应上面的答案2

例子:

#include <iostream>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <vector>

using namespace std;

class Book{
public:
  Book(string bn = "") : isbn(bn){}
  const string& getIsbn() const{
    return isbn;
  }
private:
  string isbn;
};
bool compareIsbn(const Book &b1, const Book &b2){
  return b1.getIsbn() < b2.getIsbn();
}
class Student{
public:
  Student(string n = "", int a = 0) : name(n), age(a){}
  bool operator < (const Student &s) const{
    return age < s.age;
  }
public:
  string name;
  int age;
};
int main(){
  //test1 自定义关键字类型,函数方式
  /*
  //传递函数指针的第一种写法,使用decltype
  //multiset<Book, decltype(compareIsbn)*>
  //  bookstore(compareIsbn);
  //传递函数指针的第二种写法,直接使用函数指针
  //注意:尖括号里要的是类型,不可以先定义一个函数指针的变量,然后把这个变量放到尖括号里,切记!!!
  multiset<Book, bool (*)(const Book &, const Book &)>
    bookstore(compareIsbn);
  vector<Book> books;
  for(char c = ‘5‘; c != ‘1‘; --c){
    string tmp = "isbn_0";
    tmp.insert(tmp.size(), 1, c);
    books.push_back(Book(tmp));
  }
  for(auto const &s : books){
    cout << s.getIsbn() << " ";
  }
  cout << endl;
  bookstore.insert(books.cbegin(), books.cend());
  for(auto const &s : bookstore){
    cout << s.getIsbn() << " ";
  }
  cout << endl;
  */

  //test2 自定义关键字类型,重载<方式
  multiset<Student> students;
  Student s1("C", 3);
  Student s2("A", 5);
  Student s3("A", 4);
  students.insert(s1);
  students.insert(s2);
  students.insert(s3);
  for(auto const &s : students){
    cout << s.name << ": " << s.age << endl;
  }
}

代码下载

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

原文地址:https://www.cnblogs.com/xiaoshiwang/p/9689723.html

时间: 2024-10-16 10:06:22

c/c++ 标准库 set 自定义关键字类型与比较函数的相关文章

C++标准库及其保留字(关键字)——附:C++标准文档

引言        C++到目前共发布了4个国际标准:ISO/IEC 14882:1998.ISO/IEC 14882:2003.ISO/IEC 14882:2011.ISO/IEC 14882:2014,简称C++98.C++03.C++11.C++14,目前应用广泛的还是C++11. C++标准库 C++保留字/关键字 C++11国际标准        链接:C++11国际标准草案        注:此草案与实际发布版本相差无几.

C++ 标准库类型之vector类型

vector是同一种类型的对象的集合,每个对象都有一个对应的证书索引值.和string对象一样,标准库将负责管理与存储元素相关的内存,我们把vector称为容器,因为他可以包含其他对象.一个容器中的所有对象必须是同一种类型 使用vector之前,必须包含相应的头文件. vector是一个类模板(class template)使用模板可以编写一个类定义或函数定义,而用于多个不同数据类型.因此 我们可以定义保存string对象的vector,或保存int值得vector 又或是保存自定义的类类型对象

C++ Primer 学习笔记_7_标准库类型(续1) -- vector类型

 标准库类型(二) --vector类型 引子: vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的内存. 我们将vector称之为容器,一个容器中的所有对象都必须是同一类型的! [cpp] view plaincopyprint? #include <vector> using std::vector; #include <vector> using std::vector; [模板] vector

把《c++ primer》读薄(3-3 标准库bitset类型)

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. //开头 #include <bitset> using std::bitset; 问题1.标准库bitset类型(模版) 需要处理二进制位的时候,可以使用c++标准库提供的bitset类型,它也是类模版,类似vectro容器,唯一不同的是,bitset类型需要说明长度,使用常量表达式给出的整型字面值或者已经初始化的cosnt对象. bitset<32> bit;//从0到31位算的,bit的32位每位初始化为

C++(3)标准库类型

标准库类型(一)--命名空间using与string类型 引: 标准库类型是语言组成部分中更基本的哪些数据类型(如:数组.指针)的抽象! C++标准库定义的是高级的抽象数据类型: 1.高级:因为其中反映了更复杂的概念: 2.抽象:因为我们在使用时不需要关心他们是如何表示的,我们只需要知道这些抽象数据类型支持哪些操作就可以了. 正文: 一.命名空间的using声明 1. using std::cin; ::运算符的作用含义是右操作数的名字可以在左操作数的作用域中找到. 格式: [cpp] view

C 标准库基础 IO 操作总结

其实输入与输出对于不管什么系统的设计都是异常重要的,比如设计 C 接口函数,首先要设计好输入参数.输出参数和返回值,接下来才能开始设计具体的实现过程.C 语言标准库提供的接口功能很有限,不像 Python 库.不过想把它用好也不容易,本文总结 C 标准库基础 IO 的常见操作和一些特别需要注意的问题,如果你觉着自己还不是大神,那么请相信我,读完全文后你肯定会有不少收获. 一.操作句柄 打开文件其实就是在操作系统中分配一些资源用于保存该文件的状态信息及文件的标识,以后用户程序可以用这个标识做各种读

Python常用的标准库以及第三方库有哪些?

20个必不可少的Python库也是基本的第三方库 读者您好.今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们是: Requests.Kenneth Reitz写的最富盛名的http库.每个Python程序员都应该有它. Scrapy.如果你从事爬虫相关的工作,那么这个库也是必不可少的.用过它之后你就不会再想用别的同类库了. wxPython.Python的一个GUI(图形用户界面)工具.我主要用它替代tkinter.你一定会爱上它的. Pillow.它是

C++--标准库 字符串类

一.C++标准库 C++标准库1.C++标准并不是C++语言的一部分2.C++标准库是由类库和函数库组成的集合3.C++标准库中定义的类和对象位于std命名空间中4.C++标准库的头文件都不带.h后缀5.C++标准库涵盖了C库的功能C++编译环境的组成C++标准库预定义了多数常用的数据结构代码示例 二.字符串类 Q:C语言存在的问题1.C语言不支持真正意义上的字符串2.C语言用字符数组和一组函数实现字符串操作3.C语言不支持自定义类型,因此无法获得字符串类型解决方法1.从C到C++的进化过程引入

把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 相关的内存,因为vetcor是类模版,对应多个不同类型,比如int,string,或者自己定义的数据类型等. 程序开头应如下声明 #include <iostream> #include <vector> #include <string> using std::strin