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

从零开始学C++之STL(八):函数对象、 函数对象与容器、函数对象与算法

容器的例子,大家都知道map 在插入元素的时候会自动排序,默认是根据key 从小到大排序,看map 的定义: // TEMPLATE CLASS map template Kty,...         class _Ty,          class _Pr = lessKty>,          class _Alloc = allocatorpairconst _Kty..., _Ty> > > class map     : public _TreeKty, _Ty, _Pr, _Alloc, false> > {     // ordered...Ty, _Ty, bool> {     // functor for operator<     bool operator()(const _Ty &_Left, const _Ty &_Right...我们也可以在定义的时候传递第三个参数,如map > mapTest; 则插入时按key 值从大到小排序(less,  greater 都是STL内置的类

1.7K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++【一棵红黑树封装 set 和 map】

    创建对象时,传递的参数如下: __RBTreeIteratorconst std::pair&, const std::pair*> Ref、Ptr 是 const...和 map 时,面临第一个问题:两者参数不匹配 set 只需要 key map 则需要 key 和 value 这就意味着一棵 红黑树 无法满足不同需求,难道真无法满足吗?...没有影响,对于 map 来说,普通对象对应的就是普通迭代器,不存在 普通迭代器 转为 const 迭代器 这种情况 新增这个特殊的构造函数后,能正常编译,将 e = 1 这条赋值语句取消注释,再编译,可以发现出现了预料中的报错信息...:不能给常量对象赋值 注意: set 中的普通对象对应的也是 const 迭代器,但底层 红黑树 仍然是普通对象,返回的普通迭代器无法转换为 set 中的 const 迭代器,需要通过特殊构造函数解决...+修改、查找 具体实现如下: Map.hpp V& operator[](const K& key) { //首先插入 auto ret = Insert(std::make_pair(key

    34130

    MSVC std::unique_ptr 源码解析

    _Compressed_pair _Compressed_pair 是 std::unique_ptr 内部用于存储 deleter 和裸指针的工具,从字面意思来看,它实现的功能和 std::pair...const _Ty1& _Get_first() const noexcept { return _Myval1; } }; 可以看到,_Compressed_pair 在满足条件...>) std::endl; // 输出 // 8 // 4 当 A 为空类时,由于 c++ 的机制,会为其保留 1 字节的空间,A 和 int 联合存放在 std::pair 里时,因为需要进行对齐...,当满足删除器类型不是指针而且可默认构造的情况下启用,直接把传入的裸指针存入 pair,这时候由于删除器是可默认构造的,pair 中保存的删除器会被直接默认构造。...另外的三个也需要满足一定条件,这时可以从外部传入删除器,并将其保存至 pair 中。

    1.6K10

    【Example】C++ 标准库常用容器全面概述

    (const修饰) crend 返回list中末尾的常量反向迭代器。(const修饰) emplace 将元素原位插入到指定位置。 emplace_back 将元素原位插入到末尾位置。...(const修饰) crend 返回指向末尾的逆向常量迭代器。(const修饰) emplace 将元素原位插入到指定位置。 emplace_back 将元素原位插入到末尾位置。...operator= 将 deque 的元素替换为另一个 deque 的副本。...(const修饰) crend 返回一个常量反向迭代器,此常量反向迭代器指向Map末尾位置。(const修饰) emplace 将原位构造的元素插入到Map中。...运算符: 名称 说明 operator[] 将元素插入到具有指定键值的映射。(在std::multimap中不提供) operator= 将一个映射中的元素替换为另一映射副本。

    3.4K30

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

    可以用适当的键值从 map 容器中检索对象。图 1 展示了一个用名称作为键的 map 容器,对象是整数值,用来表示年龄。 ?...例: namespace std{ template 1, class T2> bool operatorconst pair1, T2>&x, const pair1...参数的函数传递两个值时, make_pair()尤其显得方便, void f(std::pairconst char*>); void foo{ f(std::make_pair(42..., '@')); //pass two values as pair } 1 pair的应用 pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key...这里给出三种数据查找方法 第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况

    4.8K10

    C++11新特性 右值引用与新的类功能

    ","排序"},{"insert","插入"} }; // 这里{"sort", "排序"}会先初始化构造一个pair对象 v = { 10,20,30 };// 使用大括号对容器赋值 return...int&& r1 = 10; // error C2440: “初始化”: 无法从“int”转换为“int &&” int a = 10; int&& r2 = a;// message :...无法将左值绑定到右值引用 // 右值引用可以引用move以后的左值 int&& r3 = std::move(a); return 0; } 5.3 右值引用的使用场景和意义 前面我们可以看到左值引用既可以引用左值和又可以引用右值...我们无法直接获取参数包args中的每个参数的,只能通过展开参数包的方式来获取参数包中的每个参数,这是使用可变模版参数的一个主要特点,也是最大的难点,即如何展开可变模版参数。...int main() { std::liststd::pair > mylist; // emplace_back支持可变参数,拿到构建pair对象的参数后自己去创建对象

    10210

    女朋友:有点感慨,这些年她在背后默默为你做了那么多事......

    :pairconst Method, std::mapstd::basic_string, HandlerItem, std::lessstd::basic_string ...>("/test", std::allocator()), Method::Get, nullptr);     return 0; } 代码有点乱,主要是掺杂着许多模板的代码,我用红色字体标出哪些是编译器自动插入的代码...::allocatorstd::pairconst std::basic_string, HandlerItem> > > > >(std::pairstd::mapstd::string str2(str1);     //C++11标准之后,如果str3单纯只是为了用来构造str4,我们可以将     //str3转换为右值,让str4...std::string str3("world");     std::string str4(std::move(str3));     return 0; } 由于 C++11 标准及之后,编译器在对象的构造上偷偷做了更多的事情

    43820

    深度解析C++中的map的使用

    map的概念map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key支持小于比较,如果不支持或者需要的话可以自行实现仿函数传给第二个模版参数,map底层存储数据的内存是从空间配置器申请的...>("first", "第一个"));//我们调用make_pair这个模版参数将我们传的两个参数的模版进行推导出来了//我们使用make_pair就不用进行模版参数的声明了,直接让他们推//make_pair..."右边"} ,{"insert","插入"} ,{"string","字符串"} };//将键值对使用map进行存储起来//auto it = dict.begin();map将 map 的内容通过迭代器范围转换为一个 vector,以便后续对 vector 进行排序。...//将 map 的内容通过迭代器范围转换为一个 vector,以便后续对 vector 进行排序。

    5200

    C++ STL学习之容器set和multiset (补充材料)

    需要包含头文件: #include set和multiset都是定义在std空间里的类模板: 1 templateKty, 2 class _Pr = lessKty...改变元素值的方法是:先删除旧元素,再插入新元素。 存取元素只能通过迭代器,从迭代器的角度看,元素值是常数。...set提供的插入函数: pair insert(const value_type& elem); iterator insert(iterator pos_hint,...当插入的元素在set中已经包含有同样值的元素时,插入就会失败。所以set的返回值型别是由pair组织起来的两个值: 第一个元素返回新元素的位置,或返回现存的同值元素的位置。...第二个元素表示插入是否成功。 set的第二个insert函数,如果插入失败,就只返回重复元素的位置! 但是,所有拥有位置提示参数的插入函数的返回值型别是相同的。

    1.1K80

    C++17 在业务代码中最好用的十个特性

    lambda 捕获,但是 gcc 并没有遵循 c++标准,所以以下代码在 gcc 可以编译,clang 则编译不过 for(const auto& [key, value]: map){     [&...表达式捕获时显式引入一个引用变量通过编译 for(const auto& [key, value]: map){     [&key = key, &value = value]{         std...// pre c++17 std::pairstd::string> p1{3.14, "pi"s}; auto p1 = std::make_pair(3.14, "pi"s); // ...try_emplace 在向std::map/unordered_map中插入元素时,我们往往使用emplace,emplace的操作是如果元素 key 不存在,则插入该元素,否则不插入。...,因为参数列表中key和value是分开的 m.try_emplace("c", 10, 'c') 同时,c++17 还给std::map/unordered_map加入了insert_or_assign

    2.7K20

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

    3、使用map使用map得包含map类所在的头文件#include map>  //注意,STL头文件没有扩展名.hmap对象是模板类,需要关键字和存储对象两个模板参数:std:map插入数据的方法:第一种:用insert函数插入pair数据,下面举例说明(以下代码虽然是随手写的,应该可以在VC和GCC下编译通过,大家可以运行下看什么效果,在VC下请加入这条语句,屏蔽4786...;Insert_Pair = mapStudent.insert(map::value_type (1, "student_one"));我们通过pair的第二个变量来知道是否插入成功...要判定一个数据(关键字)是否在map中出现的方法比较多,这里标题虽然是数据的查找,在这里将穿插着大量的map基本用法。...这里给出三种数据查找方法第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况

    3.1K20

    C++进阶:详细讲解容器set与map(pair、multiset、multimap)

    1.关联式容器与序列式容器 关联式容器和序列式容器是 C++ 中两种不同的容器类型 关联式容器: 关联式容器主要包括 std::set, std::map, std::multiset, std:...拷贝构造函数: template pair (const pair& pr); 拷贝构造函数用于从另一个 std::pair 对象 pr 中复制键值对来构造一个新的...初始化构造函数: pair (const first_type& a, const second_type& b); 初始化构造函数接受两个参数 a 和 b,分别用于初始化 std::pair 对象的...由于 set 中元素的键值是唯一的,因此该函数的返回值要么是 0(元素不存在),要么是 1(元素存在)。...(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递) Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的空间配置器

    39810

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

    >(std::cout,"\n")); //无法通过编译,因为当你告诉 ostream_iterator一个std::string时,编译器检测到那和ssp中存储的对象类型 string* 之间不匹配...,拒绝编译 //将循环中 * 改成 ** 可能输出你想要的结果,也可能不是,因为它是按照指针的值进行排序,而不是 string的值排序 //为什么会出现以上问题?...//map 和multimap类型得对象中元素得类型是pairconst K,V>,因此K不能被改变(当然你使用const_cast除外) std::map编译 //但是,对于 set或者multiset却是可以得,因为存储得元素类型是T,而不是const T , 好像也不能编译 std::setstd::string> m_; m...//将name换为city测试下 }; //自定义数据的hash函数 //typedef unsigned int size_t; struct stu_hash{ size_t operator()

    1.9K10

    如何优雅的传递 stl 容器作为函数参数来实现元素插入和遍历?

    别着急,真正的难点在于从数据库恢复数据。首先直接使用迭代器是不行了,因为我们现在要往容器里插入元素,迭代器只能遍历元素,一点帮助也没有。...代替 "it->";插入元素时需要使用 “*it = std::make_pair (sm.msgid, sm)” 代替 “*it = sm”。做完上述修改,我发现程序仍然编译不通过。...怎么办呢,幸好已经有好心人写好了 map 的插入器 —— map_inserter: 1 #pragma once 2 3 namespace std 4 { 5 template...~ 特别需要说明的是,最有技术含量的缺失发生在 line 37 的一个引用符,如果没有加入这个,虽然可以通过编译,但在运行过程中,inserter 不能向 map 中插入元素,会导致从数据库读取完成后得到空的...server_msg_t, std::lessstd::string> > inserter_t; 34 } 将模板函数声明从类中移到类外(line 27-30),同时修改 engine_db.cpp

    3.7K20

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

    下面这个程序编写的比较规则是要求按键值由大到小的顺序将元素插入到map中 1#include map> 2#include 3#include 4 5...这里讲三种插入数据的方法: 第一种:用insert函数插入pair数据,下面举例说明(以下代码虽然是随手写的,应该可以在VC和GCC下编译通过,大家可以运行下看什么效果,在VC下请加入这条语句,屏蔽4786...数据的查找(包括判定这个关键字是否在map中出现) 在这里我们将体会,map在数据插入时保证有序的好处。...这里给出三种数据查找方法 第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况...另外 由于STL是一个统一的整体,map的很多用法都和STL中其它的东西结合在一起,比如在排序上,这里默认用的是小于号,即less,如果要从大到小排序呢,这里涉及到的东西很多,在此无法一一加以说明。

    10.2K90
    领券