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

std::set<pair<int,int> >-仅使用pair<>::first作为关键字进行查找

std::set 是 C++ 标准库中的一个关联容器,它包含一组唯一的对象。std::set 中的元素自动按键排序,这里的“键”是指元素类型的某个成员。对于 std::pair<int, int> 类型的元素,std::set 默认会使用整个 pair 对象来进行排序和查找。

如果你想要 std::set 仅使用 pairfirst 成员作为关键字进行查找,你可以提供一个自定义的比较函数或者重载 pair< 运算符。以下是两种实现方式:

使用自定义比较函数

代码语言:txt
复制
#include <iostream>
#include <set>

struct PairCompare {
    bool operator()(const std::pair<int, int>& lhs, const std::pair<int, int>& rhs) const {
        return lhs.first < rhs.first;
    }
};

int main() {
    std::set<std::pair<int, int>, PairCompare> s;
    s.insert(std::make_pair(1, 2));
    s.insert(std::make_pair(3, 4));
    s.insert(std::make_pair(1, 5));

    // 查找
    auto it = s.find(std::make_pair(1, 0));
    if (it != s.end()) {
        std::cout << "Found: (" << it->first << ", " << it->second << ")\n";
    } else {
        std::cout << "Not found\n";
    }

    return 0;
}

在这个例子中,我们定义了一个 PairCompare 结构体,它重载了 () 运算符来比较两个 pairfirst 成员。然后我们在创建 std::set 时将 PairCompare 作为第二个模板参数传入。

重载 pair< 运算符

代码语言:txt
复制
#include <iostream>
#include <set>

namespace std {
    template <>
    struct less<pair<int, int>> {
        bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) const {
            return lhs.first < rhs.first;
        }
    };
}

int main() {
    std::set<std::pair<int, int>> s;
    s.insert(std::make_pair(1, 2));
    s.insert(std::make_pair(3, 4));
    s.insert(std::make_pair(1, 5));

    // 查找
    auto it = s.find(std::make_pair(1, 0));
    if (it != s.end()) {
        std::cout << "Found: (" << it->first << ", " << it->second << ")\n";
    } else {
        std::cout << "Not found\n";
    }

    return 0;
}

在这个例子中,我们在 std 命名空间中特化了 less<pair<int, int>> 模板,重载了 < 运算符来仅比较 pairfirst 成员。

应用场景

这种仅使用 pairfirst 成员作为关键字的 std::set 可以用于多种场景,例如:

  • 当你需要根据某个特定的键(这里是 first 成员)来快速查找、插入和删除元素时。
  • 当你需要维护一个有序集合,并且这个集合中的元素根据某个特定的键来排序时。

遇到的问题及解决方法

如果你在使用上述方法时遇到了问题,比如编译错误或者运行时错误,请确保:

  1. 你的比较函数或重载的 < 运算符逻辑正确。
  2. 你没有在其他地方修改了 std::set 的比较逻辑。
  3. 你的编译器支持 C++11 或更高版本,因为模板特化和自定义比较函数是 C++11 引入的特性。

如果问题依然存在,请提供具体的错误信息,以便进一步诊断问题所在。

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

相关·内容

  • C++ STL之map容器用法详解 (包含pair,make_pair等等)

    map 容器是关联容器的一种。在关联容器中,对象的位置取决于和它关联的键的值。键可以是基本类型,也可以是类类型。字符串经常被用来作为键,如果想要保存姓名和地址的记录,就可以这么使用。名称通常可能是一个或多个字符串。关联容器中的对象位置的确定取决于容器中的键的类型,而且对于特定容器类型的内部组织方式,不同的 STL 有不同的实现。 map<K,T> 类模板定义在 map 文件头中,它定义了一个保存 T 类型对象的 map,每个 T 类型的对象都有一个关联的 K 类型的键。容器内对象的位置是通过比较键决定的。可以用适当的键值从 map 容器中检索对象。图 1 展示了一个用名称作为键的 map<K,T> 容器,对象是整数值,用来表示年龄。

    01

    学了C++不会STL,简直少了左膀右臂

    容器(Container): 是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器; 迭代器(Iterator): 提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定了operator*()以及其他类似于指针的操作符地方法的类对象; 算法(Algorithm): 是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用; 仿函数(Functor) 适配器(Adaptor) 分配器(allocator) 仿函数、适配器、与分配器用的比较少,甚至没用过!在这里不做说明,有兴趣可以自己学习一下,那个东西C++软件工程可能用的比较多。

    02

    OpenCV4,5个方法让你从小白到大佬

    我之前在群里看到好多朋友halcon转opecv的学习都很难的。今天我给大家讲讲。学习C++版本的OpenCV会很难,是否需要基础知识。其实这里大家有个很深的误解,OpenCV早期的语法都是基于C++98,这个语法比较坑,让大家学习起来感觉很难。但是后来OpenCV3之后,特别是OpenCV4以来早就支持标准的C++11语法了,很多接口跟函数都特别容易理解,C++11可以说应用最广泛的C++标准之一了,语法通俗易懂,大量智能指针加持,支持各种标准容器操作,可以说跟C#与Java这样的面向对象语言的语法基本完全类似,可以让你轻松驾驭,只要你接触过面向对象的编程语言,可以说零基础学习OpenCV C++完全不是问题,当然有几个最常用的语法跟容器可能需要提前铺垫一下,我这里也从实际项目跟代码实践总结出下面C++基础知识点,帮助大家在学习OpenCV C++的时候可以更快,更好的入门。 下面我们做代码演示如下:

    01

    极简教程 | OpenCV4 C++学习 必备基础语法知识

    大家好,之前我在B站发布了OpenCV C++快速入门30讲的视频合集,得到很多人回复跟反馈,很多人问我是不是学习C++版本的OpenCV会很难,是否需要基础知识。其实这里大家有个很深的误解,OpenCV早期的语法都是基于C++98,这个语法比较坑,让大家学习起来感觉很难。但是后来OpenCV3之后,特别是OpenCV4以来早就支持标准的C++11语法了,很多接口跟函数都特别容易理解,C++11可以说应用最广泛的C++标准之一了,语法通俗易懂,大量智能指针加持,支持各种标准容器操作,可以说跟C#与Java这样的面向对象语言的语法基本完全类似,可以让你轻松驾驭,只要你接触过面向对象的编程语言,可以说零基础学习OpenCV C++完全不是问题,当然有几个最常用的语法跟容器可能需要提前铺垫一下,我这里也从实际项目跟代码实践总结出下面C++基础知识点,帮助大家在学习OpenCV C++的时候可以更快,更好的入门。

    02

    疯子的算法总结(三) STL Ⅱ迭代器(iterator) + 容器

    背景:指针可以用来遍历存储空间连续的数据结构,但是对于存储空间费连续的,就需要寻找一个行为类似指针的类,来对非数组的数据结构进行遍历。 定义:迭代器是一种检查容器内元素并遍历元素的数据类型。 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。 迭代器(Iterator)是指针(pointer)的泛化,它允许程序员用相同的方式处理不同的数据结构(容器)。 (1)迭代器类似于C语言里面的指针类型,它提供了对对象的间接访问。 (2)指针是C语言中的知识点,迭代器是C++中的知识点。指针较灵活,迭代器功能较丰富。 (3)迭代器提供一个对容器对象或者string对象的访问方法,并定义了容器范围。

    02
    领券