首页 > 其他分享 >STL 坑点/细节

STL 坑点/细节

时间:2023-11-03 13:33:09浏览次数:32  
标签:int const Key STL comp 坑点 细节 key id

引自 cppreference.com 的语句会标粗体。

有些可能不是标准中的内容,但是 GCC 是这么实现的。

所有 STL

  1. 如果两个对象 ab 相互不比较小于对方:!comp(a, b) && !comp(b, a),那么认为它们等价。

    即在 STL 中,a == b \(\iff\) !comp(a, b) && !comp(b, a)

std::multiset<Key, Compare, Allocator>

  1. erase(const Key& key)移除键等价于 key 的所有元素。如果只想删除一个,请使用 erase(find(key))

  2. count(const Key& key) 的时间复杂度:与容器大小成对数,加上与找到的元素数成线性,即 \(O(\log \operatorname{size}+\operatorname{count}(x))\)。

  3. 比较等价的元素顺序是插入顺序,而且不会更改。(C++11 起)

    我的理解就是 Key 相同时,后插入的元素排在后面。

  4. find(const Key& key) lower_bound(const Key& key) upper_bound(const Key& key) 都返回最先插入的元素。

对于 3, 4 两点的示例:

#include<bits/stdc++.h>
using namespace std;
struct Value {
    int val, id;
    Value(int v, int i): val(v), id(i) {}
    bool operator<(const Value &b) const {
        return val < b.val;
    }
};
multiset<Value> st;
signed main() {
    for(int i = 1; i <= 5; ++i) 
        st.emplace(19260817, i);
    for(int i = 6; i <= 10; ++i)
        st.emplace(1, i);
    for(auto i : st) cout << i.id << ' ';

    cout << endl;
    cout << st.find(Value(19260817, 100))->id << endl;
    cout << st.lower_bound(Value(12345678, 100))->id << endl;
    cout << st.upper_bound(Value(12345678, 100))->id << endl;

    st.erase(st.find(Value(19260817, 100)));
    cout << st.find(Value(19260817, 100))->id << endl;
    cout << st.lower_bound(Value(12345678, 100))->id << endl;
    cout << st.upper_bound(Value(12345678, 100))->id << endl;
    return 0;
}

输出:

6 7 8 9 10 1 2 3 4 5 
1
1
1
2
2
2

标签:int,const,Key,STL,comp,坑点,细节,key,id
From: https://www.cnblogs.com/untitled0/p/STL.html

相关文章

  • c++ STL源码解读
    红黑树map,key不能添加相同的key,如果添加不会报错,但是添加不进去 #include<iostream>#include<map>#include<set>usingnamespacestd;intmain(intargc,charconst*argv[]){map<int,int>a;a.insert(make_pair(1,1));a.insert(make_pair(1,......
  • 你以为你了解TCP协议?这些你可能不知道的细节才是关键!
    引言在之前的内容中,我们已经详细讲解了TCP面试中最常见的问题,如三次握手和四次挥手等。而今天,我们将继续深入探讨TCP协议的其他方面,比如序列号和TCPFastOpen(TFO)等重要细节问题。这些内容将为你在面试中提供更全面的知识储备。为什么SYN/FIN不包含数据却要消耗⼀个序列号?SYN......
  • 使用docker 部署testlink
    docker部署testlink1、拉取db镜像:dockerpullbitnami/mariadb 2、拉取testlink镜像:dockerpullbitnami/testlink3、容器网络:docker networkcreatetestlink4、查看网络:dockernetworkls 4.1、删除网络 dockernetworkrm<networkname>5、创建数据库卷......
  • STL之红黑树的模拟实现(万字长文详解)
    STL之红黑树的模拟实现红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,==红黑树确保没有一条路径会比其他路径长出俩倍==,因而是==接近平衡==的。==意思就是最长路......
  • 爬虫工具—whistle安装与使用
    参考链接https://mbd.baidu.com/ug_share/mbox/4a83aa9e65/share?product=smartapp&tk=fae2094d0e00d4e4fae484fa554fe802&share_url=https%3A%2F%2Fzoyi14.smartapps.cn%2Fpages%2Fnote%2Findex%3Fslug%3D17c48959be44%26origin%3Dshare%26_swebfr%3D1%26_swebFromHost%......
  • ubuntu中vi编辑器的一个细节
    但是这样回车就会默认给你//......
  • stm32cubeide+bootloader跳转的方法和坑点
    网上介绍方法很多,跳转原理可以看这一篇  基于STM32的简易Bootloader实现-JiuLiBlog-博客园(cnblogs.com)大概步骤为:先判断栈顶地址是否合法,再关闭总中断和systick中断,再设置跳转地址、再加载栈顶地址,然后就可以跳转了,跳转后的应用程序需要先设置栈顶地址、再开启之前关闭......
  • STL之AVL模拟的实现(万字长文详解)
    STL之AVL模拟的实现AVL树的概念为什么会有AVL树?在STL中对map/multimap/set/multiset其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结......
  • STL
    打开伪代码看到 看到后面的主要逻辑 对函数进行翻译得到看到主要逻辑,但是写不出代码这里直接看wp的exp了  ......
  • Java基础 序列化流和反序列化流的 三个使用细节
    细节一:如果说一个类实现了Serializable接口,表示这个类的对象是可被序列化的,Java底层会根据这个类里面所有的内容进行计算,计算出一个long类型的序列号(或版本号)。假设计算出来的版本号是1,当我创建了一个这个类的对象的时候,在对象里面就包含了版本号1,用序列化流写到本地文......