首页
学习
活动
专区
工具
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...灵活性 : 由于 函数对象 是 类的实例对象 , 开发可以 通过 继承 和 重载 来 修改 重载函数调用操作符函数 的行为 ; 效率 : 在某些情况下 , 使用函数对象可能 比使用普通函数更有效率 ,

16210

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

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

14810

C++ stl_stl函数

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

2.4K31

STL小结

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

82610

【C++】哈希

注:这里哈希表使用仿函数来将字符串转化为整形与上一节红黑树使用仿函数来实例化出符合K模型的 set 和符合KV模型的 map 的两个不同的类有异曲同工之处,可以看到,仿函数能够成为 STL 六大组件之一是当之无愧的...K, class V> struct HashData { pair _kv; State _state = EMPTY; //默认为空 }; //哈希表的仿函数 template...这是因为使用素数可以减少哈希冲突的概率: 当使用素数作为除数,能够更加均匀地散列 key 值,减少了哈希冲突的发生,而如果使用合数(即非素数)作为除数,那么就会有更多的键被映射到相同的索引上,从而增加哈希冲突的概率...因此,哈希表的除数通常是严格的素数或者质数,比如 C++ STL 中的 unordered_map 和 unordered_set,其底层哈希表都是使用素数作为除数; 但并不是所有的哈希表实现都使用严格的素数或者质数作为除数...哈希表要实现使用素数作为除数也很简单,因为哈希表每次扩容都在二倍左右,所以我们只需要写出每个与2倍接近的一个素数,然后将它们放在一个数组中,哈希表每次扩容都从该数组中确定扩容后的大小即可; STL 源码中的实现如下

1K30

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

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

37700

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

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

28860

哈希(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,同时要配对应的仿函数

35420

C++ 模板学习

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

929100

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

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

55100

深度剖析哈希

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

8610

【C++】STL 容器 - set 集合容器 ④ ( 设置 set 集合容器的排序规则 | 默认的 set 集合容器 - 从小到大排列 | 设置容器从大到小排列 | 使用仿函数自定义集合排序规则 )

文章目录 一、设置 set 集合容器的排序规则 1、默认的 set 集合容器 - 从小到大排列 2、设置 set 集合容器从大到小排列 二、使用仿函数自定义 set 集合容器 排序规则 1、仿函数概念...对两个值进行了比较 , 该结构体原型如下 : // STRUCT TEMPLATE less template struct less { _CXX17_...二、使用仿函数自定义 set 集合容器 排序规则 1、仿函数概念 使用 仿函数 为 set 集合容器 定义 元素排序规则 ; 仿函数 functor 是一个在许多编程语言中都存在的概念 , 它通常指一个对象..., 仿函数可以用来实现高阶函数 , 即接受函数作为参数或返回函数函数 ; 例如 : C++ 标准库中的 std::less / std::plus 等都是仿函数类 ; 2、使用仿函数实现 set 集合容器排序规则...在下面的代码中 , 定义了仿函数类 IntCompare , 重载了operator() 函数 , 以便该仿函数可以像函数那样被调用 ; 下面的 仿函数 实现了 int 类型元素的降序排列 ; struct

53010

三十分钟掌握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

【笔记】C++标准库: 体系结构与内核分析(下)

这种函数重载的思路在STL的算法中非常常见, 各种算法都会进行复杂的迭代器判断, 这类分支很多发生在编译所以不会对执行效率有太大影响....仿函数 使用STL算法首先知道C++标准库的算法大多都以指示目标容器范围的两个迭代器开始, C标准库的算法则比较混乱....理解起来比较简单的bind2nd()是为了实现这个功能首先设计了下面这个辅助的模板函数作为接口: // 使用模板函数作为入口是因为只有模板函数能进行模板实参推导, 核心依然是函数里的模板类 template...在这里有个小称呼, 没有继承可适配接口的仿函数我们称其"没有融入STL", 这是因为只有继承了可适配接口才能完整地与STL协同使用....这也就是搬移函数使用右值引用作为参数的原因, 因为搬移语义下, 被拷贝的原对象应该是临时的, 可被马上抛弃的对象, 也就是右值对象.

77820

C++:模版进阶 | Priority_queue的模拟实现

类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。...容器适配器通过在需要自动调用算法函数make_heap、push_heap和pop_heap来自动完成此操作。 其实优先级队列就是我们数据结构里的堆!!...六、priority_queue的模拟实现 //仿函数 template struct less //冰箱里的菜 { bool...第一个方法:再写一个专门用来比较指针解引用的仿函数 struct PDateless { bool operator()(const Date* p1, const Date* p2) {...方法三:对原来的less和greater进行偏特化限制出一个专门比较任意指针类型的仿函数 //偏特化版本 具体类型,针对指针这个泛类 必须在原来的基础之上 (预制菜) template<class

10110

【C++】开散列实现unordered_map与unordered_set的封装

,unordered_map也可以使用,改为T _data即可 template struct HashNode { T _data; HashNode* _next...> _ht; }; 如此就可以实现泛型了,如果是unordered_set,结点当中存储的是键值Key;如果是unordered_map,结点当中存储的就是键值对: 哈希表仿函数的支持...而data既可以是unordered_set的,也可以是unordered_map的,所以我们需要仿函数来实现不同容器所对应的需求,然后传入: unordered_map返回kv.first template...字符串无法取模,在这里重新写一遍,字符串无法取模的问题写库的大神们早就想到了 预留一个模板参数,无论上层容器是unordered_set还是unordered_map,我们都能够通过上层容器提供的仿函数获取到元素的键值...); } 析构函数 哈希表当中存储的结点都是new出来的,所以哈希表被析构必须delete。

16520

C++仿函数

仿函数的语法几乎和我们普通的函数调用一样,不过作为仿函数的类,都必须重载operator()运算符。因为调用仿函数,实际上就是通过类对象调用重载后的operator()运算符。...上面的实例就是该做法; (2)将该“操作”设计为一个仿函数(就语言层面而言是个class),再以该仿函数产生一个对象,并以此对象作为算法的一个参数。...STL中也大量涉及到仿函数,有时仿函数使用是为了函数拥有类的性质,以达到安全传递函数指针、依据函数生成对象、甚至是让函数之间有继承关系、对函数进行运算和操作的效果。...比如STL中的容器set就使用仿函数less ,而less继承的binary_function,就可以看作是对于一类函数的总体声明了,这是函数做不到的。...3.仿函数实例 我们先来看一个仿函数的例子: #include #include using namespace std; class Functor { public

3.7K32

C++ STL学习之【优先级队列】

答案是没必要,通过 仿函数 可以轻松解决问题,这也是本文的重点内容 2.3、仿函数使用 仿函数又名函数对象 function objects,仿函数的主要作用是 借助类和运算符重载,做到同一格式兼容所有函数...这有点像函数指针,相比于函数指针又长又难理解的定义,仿函数使用可谓是很简单了 下面是两个仿函数,作用是比较大小 template struct less { //比较 是否小于...一样需要跳出,不再调整 } } 使用仿函数后,可以轻松切换为小堆 注意: 为了避免自己写的仿函数名与库中的仿函数名起冲突,最好加上命令空间,访问指定域中的仿函数 仿函数作为 STL 六大组件之一,处处体现着泛型编程的思想...仿函数给我们留了很大的发挥空间,只要我们设计的仿函数符合调用规则,那么其中的具体比较内容可以自定义(后续在进行特殊场景的比较,作用很大) 2.4、特殊场景 假设此时存在 日期类(部分) class...,因此可以专门为 Date* 编写一个仿函数(曲线救国) //小于 template struct pDateLess { bool operator()(const T& p1,

19720
领券