首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用not2时,struct vs class作为STL仿函数

在C++中,STL(标准模板库)中的仿函数是一种模板类,它们可以用于自定义排序、比较和搜索算法。在这个问答内容中,我们将讨论not2structclass在STL仿函数中的应用。

  1. not2not2是一个C++ STL中的逻辑运算符,它可以用于组合其他仿函数。not2接受两个仿函数作为参数,并返回它们的逻辑非。例如,如果第一个仿函数返回true,则not2返回false,反之亦然。
  2. structclass:在C++中,structclass都可以用于定义自定义数据类型。它们的主要区别在于默认的访问控制权限。在struct中,默认的访问控制权限是public,而在class中,默认的访问控制权限是private

在STL仿函数中,通常使用struct定义一个仿函数,因为它提供了更简洁的语法。然而,在某些情况下,使用class可能更适合,因为它提供了更好的封装和控制。

例如,以下代码演示了如何使用not2和自定义仿函数:

代码语言:cpp
复制
#include<iostream>
#include<algorithm>
#include<vector>

struct GreaterThan {
    bool operator()(int a, int b) const {
        return a > b;
    }
};

int main() {
    std::vector<int> v = { 1, 2, 3, 4, 5 };
    std::sort(v.begin(), v.end(), not2(GreaterThan()));
    for (int i : v) {
        std::cout << i << " ";
    }
    return 0;
}

在这个例子中,我们定义了一个名为GreaterThan的仿函数,它可以用于比较两个整数。然后,我们使用not2GreaterThan仿函数的逻辑非作为排序函数。最后,我们对一个整数向量进行排序,并输出排序后的结果。

总之,在C++中,not2structclass都可以用于定义和使用STL仿函数。not2是一个逻辑运算符,可以用于组合其他仿函数,而structclass可以用于定义自定义数据类型。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++】STL 算法 ① ( STL 算法相关头文件 | 函数对象 仿函数 简介 | 函数调用操作符 | 重写函数调用操作符的类 | 函数对象 与 普通函数区别 )

5、函数对象 与 普通函数 使用场景 一、STL 算法相关头文件 标准模板库 STL 算法 都定义在 , 和 三个头文件中 ; 使用...STL 标准模板库 算法时 , 导入上述 3 个头文件 , 导入时根据需求导入即可 , 不必都导入 ; #include #include #include...() 函数 ; 在 C++ 语言中 struct 结构体 与 class 类是等同的 , struct 结构体中的成员就是类成员 ; struct IntCompare { bool operator...匿名内部类 , Kotlin 中的 Lambda 表达式 , 可以作为 回调函数 使用 ; 代码示例 : #include "iostream" using namespace std; #include...灵活性 : 由于 函数对象 是 类的实例对象 , 开发时可以 通过 继承 和 重载 来 修改 重载函数调用操作符函数 的行为 ; 效率 : 在某些情况下 , 使用函数对象可能 比使用普通函数更有效率 ,

30610
  • C++ stl_stl函数

    所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。 仿函数:行为类似函数,可作为算法的某种策略。...从实现角度来看,仿函数是一种重载了operator()的class 或者class template 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。 空间配置器:负责空间的配置与管理。...STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。...templateclass T> T plus//加法仿函数 templateclass T> T minus//减法仿函数 templateclass T> T multiplies...//乘法仿函数 templateclass T> T divides//除法仿函数 templateclass T> T modulus//取模仿函数 templateclass

    2.5K31

    【C++STL】stack和queue(容器适配器、优先队列、双端队列)

    stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定 的成员函数来访问其元素。...在实际中,需要线性结构时,大多数情况下优先考虑vector和list,目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。...如果我们想让他是小堆,就得改一下他的仿函数。 sort函数排序 sort排序默认是升序,想要降序就得改仿函数。注意这里是函数模板,要传对象,所以有括号。...在C语言中,我们排序如果要控制升序降序,传的是函数指针。而这里我们传的是仿函数。 上方是仿函数的简单模拟。...pqptr.empty()) { cout << *(pqptr.top()) << " "; pqptr.pop(); } cout << endl; } //仿函数/函数对象 //它的对象可以像函数一样的去使用

    21510

    【C++】适配器+优先级队列

    但是STL中stack和queue默认是使用deque缺省的。...在stack中元素增长时,deque比vector的效率高(扩容时不需要搬移大量数据);queue中的元素增长时,deque不仅效率高,而且内存使用率高。...容器适配器通过在需要时自动调用算法函数make_heap、push_heap和pop_heap来自动完成此操作 优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector...2.3 仿函数 仿函数是一个类,重载了operator(),它的对象可以像函数一样使用,大多都是没有成员变量的类。...= Less>模版参数中仿函数的缺省值给的是类类型,所以在调用了仿函数的函数中首先应该先用Compare实例化出仿函数的对象,再用这个对象调用仿函数。

    8010

    【C++STL】优先级队列的介绍与模拟实现&&仿函数

    优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue...使用算法库里的 less 和 greater 算法,需要包含头文件 二、仿函数 ✨1,什么是仿函数 仿函数也叫函数对象,是一个重载了 运算符operator() 的类或结构体...,可以使得类的对象像函数一样使用,通过重载函数调用运算符,仿函数可以实现自定义的操作行为。...样例1: // 仿函数/函数对象:重载了oparator()的类,类的对象可以像函数一样使用 // operator()特点,参数个数和返回值根据需求确定,不固定,很多样化 class Func { public...int result = square(5); // 调用仿函数 return 0; } 通过仿函数,我们可以实现更灵活和自定义的操作行为,并且可以与STL算法等标准库函数配合使用,

    9710

    STL小结

    1).仿函数比一般的函数灵活。 2).仿函数有类型识别,可以作为模板参数。 3).执行速度上仿函数比函数和指针要更快的。 怎么使用仿函数? 除了在STL里,别的地方你很少会看到仿函数的身影。...而在STL里仿函数最常用的就是作为函数的参数,或者模板的参数。...在STL里有自己预定义的仿函数,比如所有的运算符,=,-,*,、比如'仿函数是less templateclass _Ty> struct less   : public binary_function...但是既然STL里面内定如此了,所以作为程序员你必须要遵循这个规则,否则就别想安全的使用STL。 比如我们自己定一个仿函数。...argument_type; typedef _R result_type; }; 注:仿函数就是重载()的class,并且重载函数要为const的,如果要自定义仿函数,并且用于STL接配器,那么一定要从

    85110

    移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——13.map&&set

    key为单词,value为翻译 SGI-STL中关于键值对的定义: template class T1, class T2> struct pair { typedef T1 first_type...4.set (K模型) set使用介绍 set是标准模板库(STL)中的一种关联容器,它存储的元素是唯一的,并且按照特定的顺序(默认是升序)自动排序。...自定义类型),需要用户 自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递) 4.Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的 空间配置器...所以multimap中没有重载operator[]操作 8.实际应用 1.前k个高频单词 . - 力扣(LeetCode) class Solution { public: struct...(v[i].first); } return vs; } }; 仿函数往期连接:priority移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——8.stack&

    6710

    【C++修炼之路】23.哈希封装unordered系列

    之前所学到的红黑树封装map和set时,为了map和set能够共用一套红黑树结构,我们将红黑树的参数类型以及模板数量类型进行的改良,增加一个能够读取参数相应大小的仿函数KeyOfT,对于这次的封装,同样采用这种方式...在映射时我们发现,也会用到_tables.size();,这是HashTable中私有成员的成员函数,为了可以访问,有两种方式,其一是在HashTable中再封装一个公有函数返回这个值,其二是在HashTable...,因为新增了一个转换的仿函数KeyofT,为了更加灵活,在对应封装的Unordered系列中对Hash进行了调用,这样会更加的灵活。...#pragma once //仿函数:解决s映射问题,完全没有关联的类型不能随便转,这个不能string转整形,因此还需要写一个 templateclass K> struct HashFunc {..._tables[i] = nullptr; } } pair Insert(const T& data) { KeyOfT kot;//仿函数

    40700

    【数据结构进阶】哈希表

    当装填因子到达一定阈值时,哈希表就需要扩容。若哈希表使用开放定址法处理冲突,那么该阈值通常在0.7~0.8之间;若使用链地址法,则该阈值通常为1。...代码如下: //支持内置类型转化为整形的仿函数 templateclass K> class ToInt { public: size_t operator()(const K& key)//这里转换为...函数接收一个参数n,并返回数组中第一个不小于n的元素。而第一个元素53就可以作为我们哈希表的初始大小,接下来实现构造函数时调用该函数即可。...tables;//使用vector表示哈希表 size_t _n = 0;//记录已有元素个数 ToInteger _toi;//仿函数对象 }; 结构定义当中,我们使用了vector用于存储数据...哈希表的查找 查找时的逻辑与插入过程大体相同,同样使用哈希函数求出索引值,然后用线性探测法进行查找(注意按键查找)。

    10710

    C++【哈希表的完善及封装】

    _n; return *this; } 注意: 提供了 拷贝构造 之后,就得提供 默认构造函数 1.2、优化:哈希函数 在实际使用中,往往需要以 字符串 作为存储依据(键值),比如 姓名 与 快递信息...,再利用 模板特化,使其既能支持 整型 也能支持 字符串 //获取 key 值的仿函数 templateclass K> struct GetKey { size_t operator()(const...SGI 版 STL 中,哈希表 在扩容时就使用了这一技巧 简单来说,就是当我们扩容后,按照 下一个素数值大小 进行扩容 这些素数都是近似 2 倍的大小关系,在确保不会频繁扩容的同时,尽可能减少哈希冲突...所以需要这样一个函数 //获取素数 size_t GetNextPrime(size_t prime) { //返回当前位置的下一个素数值,作为扩容后的空间大小 // SGI版 static const...答案是:传递仿函数,根据自己的需求,创建仿函数,然后传给 哈希表,让 哈希表 在计算 key 时使用即可,当然 哈希表 中涉及获取 key 的地方都要改 HashTable.hpp //对哈希表的前置声明

    33960

    哈希(unordered_map、unordered_set)

    概念 通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立 一一映射的关系,那么在查找时通过该函数可以很快找到该元素。...哈希函数设计原则: 哈希函数的定义域必须包括需要存储的全部关键码,而如果散列表允许有m个地址时,其值 域必须在0到m-1之间 哈希函数计算出来的地址能均匀分布在整个空间中 哈希函数应该比较简单 除留余数法...设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数, 按照哈希函数:Hash(key) = key% p(p<=m),将关键码转换成哈希地址 字符串哈希算法 字符串哈希算法...unordered_map和unordered_set封装 hash表(开散列) 几个点: 模板类,第一个模板参数是K,第二个参数T,上层决定这个T是什么 传入仿函数KeyOfT,这个可以从T类型中取K...< ":" << kv.second << endl; } } } unordered_set unordered_set的底层也是哈希表,第二个模板参数传个K,同时要配对应的仿函数

    38220

    【C++】哈希表的实现

    1.6 处理哈希冲突 实践中哈希表⼀般还是选择除法散列法作为哈希函数,当然哈希表⽆论选择什么哈希函数也避免不了 冲突,那么插⼊数据时,如何解决冲突呢?主要有两种两种⽅法,开放定址法和链地址法。...*(last - 1) : *pos; } key不能取模的问题 当key是string/Date等类型时,key不能取模,那么我们需要给HashTable增加⼀个仿函数,这个仿函 数⽀持把key转换成...⼀个可以取模的整形,如果key可以转换为整形并且不容易冲突,那么这个仿函数 就⽤默认参数即可,如果这个Key不能转换为整形,我们就需要⾃⼰实现⼀个仿函数传给这个参数,实 现这个仿函数的要求就是尽量key...K,class V> struct HashData { pair _kv; State _state = EMPTY; }; //仿函数(把类型强转) templateclass...V>& kv) :_kv(kv) , _next(nullptr) {} }; //类型转换,仿函数 templateclass K, class V, class

    11010

    C++ 模板学习

    底线是:自动模板参数推导包含类型转换,并且在编译器自动决定模板参数时某些类型属性将丢失。这些类型属性可以在使用显式函数模板参数申明时得以保留。 6....仿函数 仿函数这个词经常会出现在模板库里(比如 STL),那么什么是仿函数呢? 顾名思义:仿函数就是能像函数一样工作的东西,请原谅我用东西这样一个代词,下面我会慢慢解释。...答案1:重载了 () 操作符的对象,因此,这里需要明确两点:   1 仿函数不是函数,它是个类;   2 仿函数重载了()运算符,使得它的对你可以像函数那样子调用(代码的形式好像是在调用比如:   struct...当然,答案3 成员函数指针指向的成员函数就是意料之中的答案了。 8. 仿函数的用处 不管是对象还是函数指针等等,它们都是可以被作为参数传递,或者被作为变量保存的。...因此我们就可以把一个仿函数传递给一个函数,由这个函数根据需要来调用这个仿函数(有点类似回调)。 STL 模板库中,大量使用了这种技巧,来实现库的“灵活”。

    970100

    【C++修炼之路】22.哈希

    插入 通过哈希函数获取待插入元素在哈希表中的位置 如果该位置中没有元素则直接插入新元素,如果该位置中有元素发生哈希冲突,使用线性探测找到下一个空位置,插入新元素 删除 采用闭散列处理哈希冲突时,...解决方式->仿函数 通过仿函数的方式就可以将类型在映射时将string类型成功转换。...(size_t)key; } }; //这个是针对string类型的仿函数 //特化 template struct HashFunc { size_t operator()...,这就体现了仿函数的灵活比较。...因此对于unordered_map,通过观察同样发现,其就利用了哈希的仿函数进行映射,在使用unordered_map时,我们一般传入两个参数,第三个有缺省值,对于string类型等还有模板的特化,因此在调用库中的

    57800

    深度剖析哈希

    ,若关键码相等,则搜索成功 哈希中使用的函数叫做哈希函数,通过哈希构建的结构称为哈希表或者散列表。...我们的哈希函数需要满足: 哈希函数的定义域必须包括需要存储的全部关键码,而如果散列表允许有m个地址时,其值 域必须在0到m-1之间 哈希函数计算出来的地址能均匀分布在整个空间中 哈希函数应该比较简单...这种问题还得是需要仿函数这位大哥来解决。...2.4 整体代码 //哈希表的仿函数 templateclass K> struct HashFunc { size_t operator()(const K& key) { return...素数做除数和哈希表结构问题 我们上面在介绍除留余数法时给出的定义是这样的:设哈希表中允许的地址数为m,取一个不大于m,但最接近或者等于m的素数p作为除数,按照 哈希函数 Hash(key) = key

    11210

    【C++】基础:语言基础与标准库介绍

    struct和class的区别 在 C 语言中,结构体(struct)默认是没有构造函数的,需要使用初始化函数或赋值语句给结构体变量成员赋值。...而 class 的默认访问权限为 private),以及继承时的默认继承方式(struct 的默认继承方式为 public,而 class 的默认继承方式为 private)等。...因此,在 C++ 中,我们可以将结构体作为一种类来看待。 2. 标准库 STL介绍 STL ⼀共提供六⼤组件,包括容器,算法,迭代器,仿函数,配接器和配置器,彼此可以组合 套⽤。...仿函数:从实现的⻆度看,仿函数是⼀种重载了 operator()的类或者类模板。 可以帮助算法实 现不同的策略。 配接器:⼀种⽤来修饰容器或者仿函数或迭代器接⼝的东⻄。...回调函数就相当于⼀个中断处理函数,由系统在符合你设定的条件时⾃动调⽤。

    8410

    哈希表的实现--C++

    当使用除法散列法时,建议M取不太接近2的整数次幂的一个质数(素数)。...需要注意的是每次初始化哈希表时,随机选取全域散列函数组中的一个散列函数使用,后续增删查改都固定使用这个散列函数,否则每次哈希都是随机选一个散列函数,那么插入是一个散列函数,查找又是另一个散列函数,就会导致找不到插入的...二、处理哈希冲突 实践中哈希表一般还是选择除法散列法作为哈希函数,当然哈希表无论选择什么哈希函数也避免不了冲突,那么插入数据时,如何解决冲突呢?主要有两种两种方法,开放定址法和链地址法。...*(last - 1) : *pos; } key不能取模的问题 当key是string/Date等类型时,key不能取模,那么我们需要给HashTable增加一个仿函数,这个仿函数⽀持把key转换成一个可以取模的整形...,如果key可以转换为整形并且不容易冲突,那么这个仿函数就用默认参数即可,如果这个Key不能转换为整形,我们就需要自己实现一个仿函数传给这个参数,实现这个仿函数的要求就是尽量key的每值都参与到计算中,

    11210

    C++ —— 哈希详解 - 开散列与闭散列

    ⼊的key了 1.5 处理哈希冲突 实践中哈希表⼀般还是选择除法散列法作为哈希函数,当然哈希表⽆论选择什么哈希函数也避免不了冲突,那么插⼊数据时,如何解决冲突呢?...K, class V> struct HashData { pair _kv; State _state = EMPTY;//状态为空 }; templateclass K> struct...*(last - 1) : *pos; } namespace open_address//开发定址法 { //加上一个仿函数Hash,用于转换成为无符号整形 templateclass...key不能取模,那么我们需要给HashTable增加⼀个仿函数,这个仿函数⽀持把key转换成⼀个可以取模的整形 如果key可以转换为整形并且不容易冲突,那么这个仿函数就⽤默认参数即可,如果这个Key...不能转换为整形,我们就需要⾃⼰实现⼀个仿函数传给这个参数,实现这个仿函数的要求就是尽量key的每值都参与到计算中,让不同的key转换出的整形值不同 string做哈希表的key⾮常常⻅,所以我们可以考虑把

    4600

    三十分钟掌握STL

    例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组。 要点 STL算法作为模板函数提供。...程序可能把迭代器作为一个变量创建。一个STL 容器类可能为了使用一个特定类型的数据而创建一个迭代器。作为指针,必须能够使用*操作符类获取数据。你还可以使用其他数学操作符如++。...incorrect 当使用STL函数时,只能测试ip是否和past-the-end 值是否相等。尽管在本例中ip是一个C++指针,其用法也必须符合STL迭代器的规则。...STL 中的帮定器有: bind1st() 创建一个函数对象,该函数对象将值V作为第一个参数A。 bind2nd()创建一个函数对象,该函数对象将值V作为第二个参数B。...not1()接受单目函数对象,not2()接受双目函数对象。否定函数对象通常和帮定器一起使用。

    2.1K80
    领券