首页
学习
活动
专区
工具
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等等)

字符串经常被用来作为键,如果想要保存姓名和地址的记录,就可以这么使用。名称通常可能是一个或多个字符串。...pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。...2 make_pair函数 template pair make_pair(T1 a, T2 b) { return pair(a, b); } 很明显,我们可以使用pair的构造函数也可以使用make_pair...数据的查找(包括判定这个关键字是否在map中出现) 在这里我们将体会,map在数据插入时保证有序的好处。...要判定一个数据(关键字)是否在map中出现的方法比较多,这里标题虽然是数据的查找,在这里将穿插着大量的map基本用法。

4.6K10

C++:set、map的使用及其特性和区别

下面介绍一下这四种容器的简单使用。 1.set set里面每个元素只存有一个key值,它支持高效的关键字查询操作,比如检查一个关键字是否在set中。如果这个key值之前存在的话就不插入。...简单使用如下: 插入: set s; s.insert(2); s.insert(1); s.insert(4); s.insert(5); s.insert(3); s.insert(5);...查找: //时间复杂度:O(logN)----底层是搜索树 set::iterator pos = s.find(3); //时间复杂度:O(N)----需要遍历一遍(不建议使用) //set...里面的元素可以根据键进行自动排序,由于map是key_value的形式,所以map里的所有元素都是pair类型。pair里面的first被称为key(键),second被称为value(值)。...它可以通过关键字查找映射关联信息value,同时根据key值进行排序。

74100
  • C++中的STL中map用法详解

    3、使用map使用map得包含map类所在的头文件#include   //注意,STL头文件没有扩展名.hmap对象是模板类,需要关键字和存储对象两个模板参数:std:map personnel;这样就定义了一个用int作为索引,并拥有相关联的指向string的指针.为了使用方便,可以对模板类进行一下类型定义,typedef map UDT_MAP_INT_CSTRING...要判定一个数据(关键字)是否在map中出现的方法比较多,这里标题虽然是数据的查找,在这里将穿插着大量的map基本用法。...::pair对象,包括两个数据 iterator->first和 iterator->second分别代表关键字和存储的数据。...第三种:这个方法用来判定数据是否出现,是显得笨了点,但是,我打算在这里讲解lower_bound函数用法,这个函数用来返回要查找关键字的下界(是一个迭代器)upper_bound函数用法,这个函数用来返回要查找关键字的上界

    3K20

    11.1 C++ STL 应用字典与列表

    最后,该程序使用迭代器循环遍历map容器,将所有键值对按照key的降序依次输出。该代码的核心功能是创建一个带有某种关键字类型的std::map容器,并实现基本的添加数据和遍历数据的操作。...第一种查找算法,使用find()函数在vector容器中查找特定元素,如果查找成功,则输出元素在容器中的位置(下标)。注意,该函数查找序列中的第一个符合条件的元素。...第二种查找算法,使用find_first_of()函数在两个vector容器之间查找相同元素,如果查找成功,则输出该元素及其位置。...key中的value bool set_dict_value(std::map& ptr, int set_key, int set_value) { ptr[set_key]...需要注意的是,在标准库实现弹出随机数的函数中,随机数生成器需要使用当前的系统时间作为种子,因此可产生结果不同的随机数序列。

    47840

    11.1 C++ STL 应用字典与列表

    最后,该程序使用迭代器循环遍历map容器,将所有键值对按照key的降序依次输出。该代码的核心功能是创建一个带有某种关键字类型的std::map容器,并实现基本的添加数据和遍历数据的操作。...第一种查找算法,使用find()函数在vector容器中查找特定元素,如果查找成功,则输出元素在容器中的位置(下标)。注意,该函数查找序列中的第一个符合条件的元素。...第二种查找算法,使用find_first_of()函数在两个vector容器之间查找相同元素,如果查找成功,则输出该元素及其位置。...key中的value bool set_dict_value(std::map& ptr, int set_key, int set_value) { ptr[set_key]...需要注意的是,在标准库实现弹出随机数的函数中,随机数生成器需要使用当前的系统时间作为种子,因此可产生结果不同的随机数序列。

    25320

    STL的使用和背后数据结构

    > vec; (3)尾部插入元素,vec.push_back(a); (4)使用下标访问元素,cout<<vec[0]<<endl; (5)使用迭代访问元素 1 vector::iterator...如果用前两种方法插入数据,因为关键字是唯一的,所以当关键字已经存在的时候,再插入相同关键字的map是不成功的;而第三种用数组插入的方法是仍然可以的,会将原来的关键字所对应的值进行更改,相当于被覆盖掉了。...4、set:用来存储同一数据类型的数据,内部每个元素都是唯一的,且自动排序;数据结构为红黑树(RB-Tree) (1)构造函数,set c; (2)查找函数,find()函数和count()...总结 6、总结: (1)vector封装数组,list封装链表,map和set封装了二叉树; (2)对于这些STL,应当掌握基本的插入、删除、排序、查找等操作; (3)对于结构体类型的vector、map...、set、hash_map、hash_set等,需要对运算符 ‘ < ’ 进行重载。

    73610

    【c++】set和map的使用

    树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。...set中插入元素时,只需要插入value即可,不需要构造键值对。 set中的元素不可以重复(因此可以使用set进行去重)。...使用set的迭代器遍历set中的元素,可以得到有序序列 set中的元素默认按照小于来比较 set查找某个元素,时间复杂度为: log_2 n set中的元素不允许修改 set中的底层使用二叉搜索树(红黑树...如果e作为键在map中还不存在,map会使用默认构造函数创建一个对应的int值(初始值为0),然后执行++操作将其的值增加到1。...(例如使用一个键值对作为参数),它的返回值确实是一个 pair

    5300

    C++【set 和 map 学习及使用

    namespace std; int main() { vector arr = { 8,5,6,7,3,1,1,3 }; set s1; //创建一个空的 set set... #include using namespace std; int main() { vector> arr = { make_pair...[i].first); return vs; } }; 注意: 此时使用快排进行排序时,单个元素是 pair,需要自己写出仿函数进行排序,仿函数十分强大 难道基础版快排无法完成任务吗...(小的单词排在前面,就是字典序) 解法二:map + set 同样的,先使用 map 统计单词出现频率,此时已经按照字典序进行了排序,然后将 pair 看作一个 键值 存入 set 中,改变 set...中的比较逻辑(先按出现频率排序,如果相关就按照字典序排序) 整体思路与 map + sort 没啥区别,不过此时是直接使用 set 进行排序,没必要借助 vector //map + set class

    33120

    c++ list, vector, map, set 区别与用法比较

    可以不分配必须的内存大小方便的进行添加和删除操作。使用的是非连续的内存空间进行存储。    优点:(1) 不使用连续内存完成动态操作。                ...;     vector v; 或者连在一起,使用全名: std::vector v; 建议使用全局的命名域方式: using namespace std; 1.vector的声明...默认情况下,优先级队列适配器类使用的是矢量容器vector,当然可以选择指定不同的序列容器作为基础,并选择一个备用函数对象来确定元素的优先级代码如下 priority_queue<int, deque...数据的查找(包括判定这个关键字是否在map中出现) 在这里我们将体会,map在数据插入时保证有序的好处。...要判定一个数据(关键字)是否在map中出现的方法比较多,这里标题虽然是数据的查找,在这里将穿插着大量的map基本用法。

    10.1K90

    【C++高阶】高效数据结构的探索(map&&set

    (即红黑树)作为其底层结果,容器中的元素是一个有序的序列 关联式容器是C++ STL中一类重要的容器,它们通过键值对的形式存储数据,并支持快速的查找、插入和删除操作。...set中没有重载 [] 运算符 因为set要保证其有序,因此set中元素不能被直接修改,若要修改可以先删除,再插入 set中的元素不可以重复(因此可以使用set进行去重) 使用set的迭代器遍历set中的元素...,可以得到有序序列 set中的元素默认按照小于来比较 set查找某个元素,时间复杂度为: set中的元素不允许修改 set中的底层使用二叉搜索树(红黑树)来实现 multiset的概念 概念:multiset...::set myset; std::set::iterator itlow, itup; for (int i = 1; i < 10; i++) myset.insert(...,因为有make_pair的存在,我们往往使用make_pair make_pair是一个函数模板,他可以自己推演类型 int main() { map d; d.insert

    10010

    揭秘Map与Set的键值奥秘与集合魅力,解锁高效数据魔法

    std::pairstd::pair 是一个模板类,它创建了一个包含两个数据成员的对象。这两个数据成员分别被称为 first 和 second,可以分别用作键和值。...虽然 std::pair 本身不直接实现键值对的存储和查找功能,但它经常与 std::map、std::unordered_map 或其他容器一起使用来存储键值对。...集合操作:std::setstd::multiset可以用于实现集合操作,如并集、交集和差集等。 排序和去重:这些容器可以用于对元素进行排序和去重操作。...namespace std; // set的基本使用 void test_set1() { // 排序+去重 set s; s.insert(2); s.insert(4);...迭代器的使用 void test_set2() { set myset; set::iterator itlow, itup; for (int i = 1; i < 10;

    8910

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

    set 用于存储唯一的元素集合,而 map 则用于存储键值对,其中每个键都是唯一的。它们都使用红黑树(自平衡二叉搜索树)作为底层实现,因此可以提供高效的插入、查找和删除操作。...有序数据存储:由于 set 中的元素是有序的,可以用于需要对数据进行排序并快速查找的场景。 集合操作:set 可以用于实现集合的基本操作,如交集、并集和差集。...pair.first << ": " << pair.second << std::endl; } return 0; } 查找元素:可以使用 find() 函数查找指定键是否存在。...for (const auto &pair : m) { std::cout << "Map element: " << pair.first << ": " << pair.second...: um) { std::cout << "Unordered_map element: " << pair.first << ": " << pair.second << std::

    9910

    mapunordered_map基础用法

    在map中插入元素的另一种方法是使用成员函数map :: operator []。 在容器内部,map容器按照其比较对象指定的标准,通过键将所有元素进行排序。这些元素总是按照这个顺序插入到相应的位置。...重载[]具体实现如下:(*((this->insert(make_pair(k,mapped_type()))).first)).second 对它进行大致解析后,可将其修改为: template<class...map中存在,还可以用它进行查找操作。...这4个关联式容器与map/multimap/set/multiset功能基本类似,最主要就是底层结构不同,使用场景不容。...无序映射实现直接访问操作符(operator []),该操作符允许使用其键值作为参数直接访问映射值。容器中的迭代器至少是前向迭代器。

    2.6K30
    领券