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

如果没有相等运算符,STL map :: find函数如何工作?

如果没有相等运算符,STL map :: find 函数仍然可以工作,但是它需要一个比较器函数来比较键值对象。这是因为 STL map 的内部实现需要知道如何比较两个键值对象以确定它们是否相等。

如果没有提供比较器函数,STL map 将使用默认的比较器函数,该函数使用键值对象的 "<" 运算符来比较它们。如果没有 "<" 运算符,则会导致编译错误。

为了解决这个问题,您可以提供一个自定义的比较器函数,该函数可以比较键值对象并返回一个布尔值,指示它们是否相等。例如,如果您的键值对象是一个自定义类,您可以在该类中定义一个 "==" 运算符,并在 STL map 中使用该运算符来比较键值对象。

以下是一个示例代码,演示如何在 STL map 中使用自定义比较器函数:

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

class MyClass {
public:
    int value;

    bool operator==(const MyClass& other) const {
        return value == other.value;
    }
};

struct MyComparator {
    bool operator()(const MyClass& lhs, const MyClass& rhs) const {
        return lhs.value < rhs.value;
    }
};

int main() {
    std::map<MyClass, std::string, MyComparator> myMap;
    MyClass obj1 = {1};
    MyClass obj2 = {2};

    myMap[obj1] = "Object 1";
    myMap[obj2] = "Object 2";

    auto it = myMap.find(obj1);
    if (it != myMap.end()) {
        std::cout << "Found object: " << it->second<< std::endl;
    } else {
        std::cout << "Object not found"<< std::endl;
    }

    return 0;
}

在这个示例中,我们定义了一个名为 "MyClass" 的自定义类,并为其定义了一个 "==" 运算符。然后,我们定义了一个名为 "MyComparator" 的比较器结构体,并为其定义了一个 "()" 运算符。最后,我们在 STL map 中使用了这个比较器结构体,并使用自定义类的 "==" 运算符来比较键值对象。

这样,即使没有相等运算符,STL map :: find 函数也可以正常工作。

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

相关·内容

C++ STL 概述_严丝合缝的合作者

函数对象:重载了括号运算符()的模板类,为算法提供灵活的策略。 适配器:通过对已有的容器、迭代器、函数对象进行适配,创造出新的编程组件。 配置器:为容器服务,负责其内存空间的配置与管理。...//使用结构体作为函数对象 template struct Zs { // 函数对象的特点:重载 () 运算符 void operator()(T & x) const {...,但是,如果某容器类重载了[]运算符,则可以通过给定数据的索引号找到相应数据,也可以通过 at方式进行查找。...当有更复杂的查找需求时,可以使用STL算法中相应的函数模板进行查询,例如findfind_if,find_end和find_first_of。...=、、>=:比较运算符,判断两个容器之间的关系。比较返回结果是第一对不相等数据间的比较结果。如果两个容器的数据数目不相等,则容器不相等

49420
  • STL 总结与常见面试题

    所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。 仿函数:行为类似函数,可作为算法的某种策略。...STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。 3 容器 STL容器就是将运用最广泛的一些数据结构实现出来。...如果第一个序列在字典序中小于第二个序列,则返回 true。否则,返回 fa1se。如果个序列比另一个短,且所有元素都与较长序列的对应元素相等,则较短序列在字典序中更小。...如果序列长度相等,且对应元素都相等,则在字典序中任何一个都不大于另外一个。...插入操作只是结点指针换来换去,结点内存没有改变。而iterator就像指向结点的指针,内存没变,指向内存的指针也不会变。 为何map和set不能像vector一样有个reserve函数来预分配数据?

    89230

    STL小结

    例如,查找算法find_if就是对find算法的扩展,标准的查找是两个元素相等就找到了,但是什么是相等在不同情况下却需要不同的定义,如地址相等,地址和邮编都相等,虽然这些相等的定义在变,但算法本身却不需要改变...在STL里有自己预定义的仿函数,比如所有的运算符,=,-,*,、比如'<'号的仿函数是less template struct less   : public binary_function...如果你要阅读过STL的源码,你就会发现,这样的用法很多,其实没有别的目的,就是为了方便,安全,可复用性等。...为何map和set不能像vector一样有个reserve函数来预分配数据? 当数据元素增多时(10000到20000个比较),map和set的插入和搜索速度变化如何?...20、stlmap erase方法的正确使用 STLmap表里有一个erase方法用来从一个map中删除掉指令的一个节点,不存在任何问题。 如果删除多一个节点时,需要使用正确的调用方法。

    83910

    ACM竞赛常用STL(一)

    --pair STL 的头文件中描述了一个看上去非常简单的模板类pair,用来表示一个二元组或元素对,并提供了按照字典序对元素对进行大小比较的比较运算符模板函数。...当然,也可以通过重载这几个运算符来重新指定自己的比较逻辑。除了直接定义一个pair 对象外,如果需要即时生成一个pair 对象,也可以调用在中定义的一个模板函数:make_pair。...如果是基本数据类型,或已定义了比较运算符的类,可以直接用STL 的less算子和greater 算子——默认为使用less 算子,即小的往前排,大的先出队。...如果要定义自己的比较算子,方法有多种,这里介绍其中的一种:重载比较运算符。...map::iterator it = m.find(key);如果map 中存在与key 相匹配的键值时,find 操作将返回指向该元素对的迭代器,否则,返回的迭代器等于map

    79520

    map 学习(上)——C++中 map 的使用

    本篇先学习 C++ 中 STL 标准库中 map 的使用方法。...表达式 comp(a, b),其中 comp 是该类型的对象,a, b是 Key 值,如果按照函数定义的严格弱排序,参数 a 被认为排在参数 b 之前,则返回 true。...map 对象使用该表达式确定元素在容器中的位置,并判断两个元素的 Key 值是否相等(通过自反比较:如果 (!comp(a,b) && !comp(b,a) ) 结果为真,则 a, b 等价)。...map 容器中没有两个元素拥有相同的 Key 值。 Compare 可以使一个函数指针,或者函数对象(详细请参阅示例构造函数)。...map 的反向迭代器的起始位置与终点位置; 六、程序示例 以下源码摘自《C++STLmap学习》,笔者对其进行注释。

    3K60

    C++系列笔记(十一)

    STL映射类 STL map和multimap的内部结构看起来像棵二叉树。这意味着在map或multimap中插入元素时将进行排序。...要使用STL map或multimap类,需要包含头文件:#include 实例化map #include using namespace std; …… map <keyType...如果一元函数返回一个布尔值,则该函数称为谓词。 二元函数:接受两个参数的函数,如 f(x, y)。如果二元函数返回一个布尔值,则该函数称为二元谓词。...破坏性复制   std::auto_ptr是最流行(也可以说是最臭名昭著,取决于您如何看)的破坏性复制指针。被传递给函数或复制给另一个指针后,这种智能指针就没有用了。即源指针也被销毁了。...myFile.is_open()) { //do reading or writing; myFile.close(); }   open()接受两个参数:第一个是要打开的文件的路径和名称(如果没有提供路径

    1.3K20

    STL总结与常见面试题

    所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。 仿函数:行为类似函数,可作为算法的某种策略。...STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。 3 容器 STL容器就是将运用最广泛的一些数据结构实现出来。...如果第一个序列在字典序中小于第二个序列,则返回 true。否则,返回 fa1se。如果个序列比另一个短,且所有元素都与较长序列的对应元素相等,则较短序列在字典序中更小。...如果序列长度相等,且对应元素都相等,则在字典序中任何一个都不大于另外一个。...插入操作只是结点指针换来换去,结点内存没有改变。而iterator就像指向结点的指针,内存没变,指向内存的指针也不会变。 为何map和set不能像vector一样有个reserve函数来预分配数据?

    67630

    STL总结与常见面试题+资料

    所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。 仿函数:行为类似函数,可作为算法的某种策略。...STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。 3 容器 STL容器就是将运用最广泛的一些数据结构实现出来。...如果第一个序列在字典序中小于第二个序列,则返回 true。否则,返回 fa1se。如果个序列比另一个短,且所有元素都与较长序列的对应元素相等,则较短序列在字典序中更小。...如果序列长度相等,且对应元素都相等,则在字典序中任何一个都不大于另外一个。...插入操作只是结点指针换来换去,结点内存没有改变。而iterator就像指向结点的指针,内存没变,指向内存的指针也不会变。 为何map和set不能像vector一样有个reserve函数来预分配数据?

    56520

    STL总结与常见面试题

    所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。 仿函数:行为类似函数,可作为算法的某种策略。...STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。 3 容器 STL容器就是将运用最广泛的一些数据结构实现出来。...如果第一个序列在字典序中小于第二个序列,则返回 true。否则,返回 fa1se。如果个序列比另一个短,且所有元素都与较长序列的对应元素相等,则较短序列在字典序中更小。...如果序列长度相等,且对应元素都相等,则在字典序中任何一个都不大于另外一个。...插入操作只是结点指针换来换去,结点内存没有改变。而iterator就像指向结点的指针,内存没变,指向内存的指针也不会变。 为何map和set不能像vector一样有个reserve函数来预分配数据?

    3.6K98

    《逆袭进大厂》第四弹之C++重头戏STL30问30答

    )、non-trivial copy ctor(拷贝构造函数)、non-trivial assignment operator(赋值运算符) 和non-trivial dtor(析构函数),如果答案是否定的...2) map的下标运算符[]的作用是:将key作为下标去执行查找,并返回相应的值;如果不存在这个key,就将一个具有该key和value的某人值插入这个map。...1) map的下标运算符[]的作用是:将关键码作为下标去执行查找,并返回对应的值;如果不存在这个关键码,就将一个具有该关键码和值类型的默认值的项插入这个map。...2) mapfind函数:用关键码执行查找,找到了返回该位置的迭代器;如果不存在这个关键码,就返回尾迭代器。...deque迭代器的“++”、“--”操作是远比vector迭代器繁琐,其主要工作在于缓冲区边界,如何从当前缓冲区跳到另一个缓冲区,当然deque内部在插入元素时,如果map中node数量全部使用完,且node

    1.5K20

    标准关联容器一定比vector的查找速度快吗?

    , 没有定义operator(),所以派生类要定义这个 //因此,标准关联容器是基于等价而不是相等,所以每个容器必须有一个定义了怎么保持东西有序的比较函数 默认 less //3 std::set...) { std::cout<<"i: "<<i<<std::endl; } //此时:使用set的find成员函数搜索 stl 会成功 if(ciss.find...= w2_ size: 2 key_comp: 1 i: stl i: STL set.find failed std::find OK ciss: 2 ciss_ 2 i: STL i: stl set.find...//现在我们知道了两个用处,能不能有个STL提供一个两全其美的函数,在添加或更新时,自动选择调用接口,像这样 2-1 //2-1 //如果键 k不在map m中,高效地把pair(k,v)添加到m中,...否则高效地把和k关联地值更新为v,返回一个指向添加或修改pair的迭代器 //iterator affectedPair = efficientAddOrUpdate(m,k,v); //但是 stl没有这样的函数

    1.8K10

    【C++】map 和 set

    : 其中比较重要的只有 find,由于 set 中不允许出现相同的 key,因此在 set 中 count 函数的返回值只有1/0,可以说没有什么价值,set 中定义 count 主要是因为 count...map 中插入 k,这里插入的结果有两种 – 如果 map 中已经有与该值相等的节点,则插入失败,返回的 pair 中存放着该节点位置的迭代器和false;如果 map没有与该值相等的节点,则会向...所以,map 中的 operator[] 是集插入、查找、修改为一体的一个函数;示例如下: 注意: 这里修改的是 key 对应的 value,而并没有修改 key,所以并没有破坏搜索树的结构; 我们上面拆解...map中 // 如果key已经存在,插入失败,insert函数返回该key所在位置的迭代器 // 如果key不存在,插入成功,insert函数返回新插入元素所在位置的迭代器 // operator...,count 返回和 key 值相等的节点的个数: 需要注意的是,multimap 中并没有重载 [] 运算符,因为 multimap 中的元素是可以重复的,如果使用 [] 运算符,会导致多个元素的

    58800

    C++ STL精通之旅:向量、集合与映射等容器详解

    因此,在实际比赛中要权衡 STL 的利弊,不过这一点就得靠经验了。 接下来,博主会分享在算法竞赛中常用的 STL 容器,对于算法,函数和迭代器,就不着重展开讲了。...示例: 算法(Algorithms):STL中的算法是一组对容器进行操作的函数,它们独立于任何特定的数据结构,可以用于执行各种任务,如搜索、排序、复制和修改容器中的元素。...仿函数(Functors):仿函数是重载了操作符()的类或类对象,它可以像函数一样被调用。在STL中,仿函数通常用作算法的参数,允许用户自定义算法的行为,使得算法更加灵活和可配置。...multimap unordered_map 互异性 一个键仅可以在映射中出现一次 ✔ ❌(任意次) ✔ 无序性 键是没有顺序的 ❌(从小到大) ❌(从小到大) ✔ 常用方法 构造 map<键类型,...(字符串, 起始下标) int pos = s.find("awa"); 数值与字符串互转(C++11) 源 目的 函数 int / long long / float / double / long

    21600

    【C++】STL 算法 ⑧ ( 预定义函数对象 | 预定义函数对象组成 | 预定义函数对象分类 | 预定义 算术运算符 函数对象 | 预定义 比较运算符 函数对象 | 预定义 逻辑运算符 函数对象 )

    三、代码示例 - plus 函数对象使用 1、plus 函数对象 2、代码示例 3、执行结果 一、预定义函数对象 1、预定义函数对象概念 C++ 的 标准模板库 ( STL , Standard Template...Library ) 中 , 预定义了一系列的 " 函数对象 “ , 又称为 ” 仿函数 Functors " ; 这些 " 预定义函数对象 " 在 STL 算法中 , 可以 作为 算法的参数 , 定制某些参数的行为...表示 该函数对象 执行的是 什么类型 的操作 , 如果 T 为 int , 则表示 两个 int 整型值 进行加法操作 ; 如果 T 为 string , 则表示 两个 string 字符串 进行加法操作...预定义 比较运算符 函数对象 : equal_to : 判断两个值是否相等 ; not_equal_to : 判断两个值是否不相等 ; greater : 判断第一个值是否大于第二个值...都是 二元谓词 , 通常用于 sort 排序算法 , find_if 查找算法 等算法中 ; 3、预定义 逻辑运算符 函数对象 预定义 逻辑运算符 函数对象 : logical_and : 逻辑与运算

    11010

    C++系列笔记(九)

    STL算法 最常见的算法如下: std::find:在集合中查找值。 std::find_if:根据用户指定的谓词在集合中查找值。 std::reverse:反转集合中元素的排列顺序。...在string中查找字符或字符串 STL string类提供了成员函数 find,该函数有多个重载版本,可在给定 string对象中查找字符或子字符串。...使用下标运算符([ ])访问vector的元素时,如果指定的位置超出了边界,结果将是不确定的(什么情况都可能发生,很可能是访问违规)。...在list中间插入元素 std::list的特点之一是,在其中间插入元素所需的时间是固定的,这项工作是由成员函数insert完成的。...list提供了成员函数reverse(),该函数没有参数,它反转list中元素的排列顺序:listIntegers.reverse();list的成员函数sort()有两个版本,其中一个没有参数:listIntegers.sort

    1K20
    领券