当前位置: 首页 > news >正文

容器库(12)-std::unordered_multiset

unordered_multiset是以key为元素无序的关联容器,搜索、移除和插入操作是平均常数的时间复杂度。unordered_multiset在内部没有按任何顺序排列,而是放在桶当中的,放进哪个桶是通过计算key的hash值来决定的。和unordered_set不同的是,unordered_multiset中的key值可以重复。

template<class Key,class Hash = std::hash<Key>,class KeyEqual = std::equal_to<Key>,class Allocator = std::allocator<Key>
> class unordered_multiset;

本文章的代码库:

https://gitee.com/gamestorm577/CppStd

成员函数

构造、析构和赋值

构造函数

可以构造一个空的unordered_multiset,也可以用迭代器、另一个unordered_multiset或者元素列表来构造一个unordered_multiset。构造的时候还可以指定最小桶数、hash函数、比较函数或者分配器。代码示例:

std::vector<int> tmp{1, 1, 2, 3};std::unordered_multiset<int> s1;
std::unordered_multiset<int> s2(tmp.begin(), tmp.end());
std::unordered_multiset<int> s3(s2);
std::unordered_multiset<int> s4{1, 2, 3};std::cout << "s1 size = " << s1.size() << std::endl;
std::cout << "s2 size = " << s2.size() << std::endl;
std::cout << "s3 size = " << s3.size() << std::endl;
std::cout << "s4 size = " << s4.size() << std::endl;

输出结果:

s1 size = 0
s2 size = 4
s3 size = 4
s4 size = 3

对于自定义的类型,需要定义hash函数以及比较函数。代码示例: 

struct MyStruct
{int Num1;double Num2;
};struct MyHash
{std::size_t operator()(const MyStruct& val) const{return std::hash<int>()(val.Num1) + std::hash<double>()(val.Num2);}
};struct MyEqual
{bool operator()(const MyStruct& lhs, const MyStruct& rhs) const{return true;}
};std::unordered_multiset<MyStruct, MyHash, MyEqual> s;

析构函数

销毁容器时,会调用各元素的析构函数。代码示例:

struct MyStruct
{MyStruct(int i): Num(i){}~MyStruct(){std::cout << "destruct, Num = " << Num << std::endl;}int Num = 0;
};struct MyHash
{std::size_t operator()(const MyStruct& val) const{return std::hash<int>()(val.Num);}
};struct MyEqual
{bool operator()(const MyStruct& lhs, const MyStruct& rhs) const{return lhs.Num == rhs.Num;}
};std::unordered_multiset<MyStruct, MyHash, MyEqual> s{1, 1, 2, 3};
std::cout << "end" << std::endl;

输出结果:

destruct, Num = 3
destruct, Num = 2
destruct, Num = 1
destruct, Num = 1
end
destruct, Num = 3
destruct, Num = 2
destruct, Num = 1
destruct, Num = 1

赋值函数

可以用另一个unordered_multiset或者元素列表给unordered_multiset赋值。代码示例:

std::unordered_multiset<int> tmp{1, 1, 2};
std::unordered_multiset<int> s1;
std::unordered_multiset<int> s2;
s1 = tmp;
s2 = {1, 1, 2, 3};
std::cout << "s1 size = " << s1.size() << std::endl;
std::cout << "s2 size = " << s2.size() << std::endl;

输出结果:

s1 size = 3
s2 size = 4

迭代器

接口begin、cbegin指向unordered_multiset起始的迭代器,end、cend指向末尾的迭代器。无论什么迭代器都不能修改元素的值。代码示例:

std::unordered_multiset<int> s{1, 1, 2, 3};
for (auto iter = s.begin(); iter != s.end(); ++iter)
{std::cout << "num = " << *iter << std::endl;
}

输出结果:

num = 3
num = 2
num = 1
num = 1

容量

empty

检查unordered_multiset是否为空。代码示例:

std::unordered_multiset<int> s1{1, 1, 2};
std::unordered_multiset<int> s2;
std::cout << std::boolalpha;
std::cout << "s1 empty: " << s1.empty() << std::endl;
std::cout << "s2 empty: " << s2.empty() << std::endl;

输出结果:

s1 empty: false
s2 empty: true

size

获取unordered_multiset的元素个数。代码示例:

std::unordered_multiset<int> s1{1, 1, 2};
std::unordered_multiset<int> s2;
std::cout << "s1 size: " << s1.size() << std::endl;
std::cout << "s2 size: " << s2.size() << std::endl;

输出结果:

s1 size: 3
s2 size: 0

max_size

返回可以容纳的最大元素个数。代码示例:

std::unordered_multiset<char> s1;
std::unordered_multiset<std::string> s2;
std::cout << "s1 max size = " << s1.max_size() << std::endl;
std::cout << "s2 max size = " << s2.max_size() << std::endl;

输出结果:

s1 max size = 768614336404564650
s2 max size = 461168601842738790

修改器

clear

清除所有的元素。代码示例:

std::unordered_multiset<int> s{1, 1, 2, 3};
std::cout << "s size = " << s.size() << std::endl;
s.clear();
std::cout << "s size = " << s.size() << std::endl;

输出结果:

s size = 4
s size = 0

insert

插入元素,参数可以是元素、迭代器或者元素节点。代码示例:

std::unordered_multiset<int> s;s.insert(1);
s.insert(1);
std::cout << "s size = " << s.size() << std::endl;std::vector<int> tmp{2, 2, 3};
s.insert(tmp.begin(), tmp.end());
std::cout << "s size = " << s.size() << std::endl;

输出结果:

s size = 2
s size = 5

emplace

构造一个元素到容器中。代码示例:

struct MyStruct
{MyStruct(int num1, int num2): Num1(num1), Num2(num2){std::cout << "construct: " << num1 << " " << num2 << std::endl;}int Num1 = 0;int Num2 = 0;
};struct MyHash
{std::size_t operator()(const MyStruct& val) const{return std::hash<int>()(val.Num1) + std::hash<int>()(val.Num2);}
};struct MyEqual
{bool operator()(const MyStruct& lhs, const MyStruct& rhs) const{return (lhs.Num1 == rhs.Num1) && (lhs.Num2 == rhs.Num2);}
};std::unordered_multiset<MyStruct, MyHash, MyEqual> s;
s.emplace(1, 1);
s.emplace(1, 2);
s.emplace(1, 2);

输出结果:

construct: 1 1
construct: 1 2
construct: 1 2

emplace_hint

向容器中尽可能靠近hint之前的位置插入新元素:

template <class... Args>
iterator emplace_hint(const_iterator hint, Args&&... args);

不同的hint会导致插入元素的效率不同。代码示例:

auto timer = [](std::function<std::size_t()> func, std::string tag) -> void
{auto start = std::chrono::system_clock::now();std::size_t size = func();auto end = std::chrono::system_clock::now();std::chrono::duration<double, std::milli> time = end - start;std::cout << tag << ", size: " << size << ", use time: " << time.count()<< std::endl;
};const int count = 3000000;auto unordered_multiset_emplace = [=]() -> std::size_t
{std::unordered_multiset<int> s;for (int i = 0; i < count; ++i){s.emplace(i);}return s.size();
};auto unordered_multiset_emplace_hint1 = [=]() -> std::size_t
{std::unordered_set<int> s;auto iter = s.begin();for (int i = 0; i < count; ++i){s.emplace_hint(iter, i);iter = s.end();}return s.size();
};auto unordered_multiset_emplace_hint2 = [=]() -> std::size_t
{std::unordered_set<int> s;auto iter = s.begin();for (int i = 0; i < count; ++i){s.emplace_hint(iter, i);iter = s.begin();}return s.size();
};auto unordered_multiset_emplace_hint3 = [=]() -> std::size_t
{std::unordered_set<int> s;auto iter = s.begin();for (int i = 0; i < count; ++i){iter = s.emplace_hint(iter, i);}return s.size();
};timer(unordered_multiset_emplace, "unordered_multiset_emplace");
timer(unordered_multiset_emplace_hint1, "unordered_multiset_emplace_hint1");
timer(unordered_multiset_emplace_hint2, "unordered_multiset_emplace_hint2");
timer(unordered_multiset_emplace_hint3, "unordered_multiset_emplace_hint3");

输出结果:

unordered_multiset_emplace, size: 3000000, use time: 498.258
unordered_multiset_emplace_hint1, size: 3000000, use time: 511.267
unordered_multiset_emplace_hint2, size: 3000000, use time: 499.438
unordered_multiset_emplace_hint3, size: 3000000, use time: 474.257

erase

移除指定位置的元素或者移除指定的值。代码示例:

std::unordered_multiset<int> s1{1, 1, 2, 2, 3, 3, 3, 4, 4};
std::cout << "s1 size = " << s1.size() << std::endl;
s1.erase(s1.begin());
std::cout << "s1 size = " << s1.size() << std::endl;
s1.erase(s1.begin(), std::next(s1.begin(), 3));
std::cout << "s1 size = " << s1.size() << std::endl;std::unordered_multiset<int> s2{1, 1, 3, 3, 3};
std::cout << "s2 size = " << s2.size() << std::endl;
s2.erase(3);
std::cout << "s2 size = " << s2.size() << std::endl;

输出结果:

s1 size = 9
s1 size = 8
s1 size = 5
s2 size = 5
s2 size = 2

swap

和另一个容器交换元素内容。代码示例:

std::unordered_multiset<int> s1{1, 1, 2, 2};
std::unordered_multiset<int> s2{1, 1};
s1.swap(s2);
std::cout << "s1 size = " << s1.size() << std::endl;
std::cout << "s2 size = " << s2.size() << std::endl;

输出结果:

s1 size = 2
s2 size = 4

extract

提取容器中的某个元素节点,提取后容器不再拥有该元素。代码示例:

std::unordered_multiset<int> s{1, 1, 2, 3, 4};
std::cout << "s size = " << s.size() << std::endl;
auto node1 = s.extract(1);
std::cout << "s size = " << s.size() << std::endl;
auto node2 = s.extract(s.begin());
std::cout << "s size = " << s.size() << ", node2 = " << node2.value()<< std::endl;
s.insert(std::move(node2));
std::cout << "s size = " << s.size() << std::endl;

输出结果:

s size = 5
s size = 4
s size = 3, node2 = 4
s size = 4

merge

合并另一个unordered_set或者unordered_multiset中的元素。代码示例:

std::unordered_multiset<int> s1{1, 1, 2};
std::unordered_multiset<int> s2{1, 2};
s1.merge(s2);
std::cout << "s1 size = " << s1.size() << std::endl;
std::cout << "s2 size = " << s2.size() << std::endl;

输出结果:

s1 size = 5
s2 size = 0

查找

count

获取给定key值的元素数量。代码示例:

std::unordered_multiset<int> s{1, 1, 2, 3};
std::cout << "elment 1 count = " << s.count(1) << std::endl;
std::cout << "elment 2 count = " << s.count(2) << std::endl;
std::cout << "elment 4 count = " << s.count(4) << std::endl;

输出结果:

elment 1 count = 2
elment 2 count = 1
elment 4 count = 0

find

获取指定key值的元素的迭代器。如果有多个元素匹配key值,那么返回任意一个。代码示例:

std::unordered_multiset<int> s{1, 1, 2, 3};
auto iter1 = s.find(1);
auto iter2 = s.find(4);
std::cout << std::boolalpha;
std::cout << "elment has 1: " << (iter1 == s.end()) << std::endl;
std::cout << "elment has 4: " << (iter2 == s.end()) << std::endl;

输出结果:

elment has 1: false
elment has 4: true

contains

检查是否包含特定的元素。代码示例:

std::unordered_multiset<int> s{1, 1, 2, 3};
std::cout << std::boolalpha;
std::cout << "contain 1: " << s.contains(1) << std::endl;
std::cout << "contain 4: " << s.contains(4) << std::endl;

输出结果:

contain 1: true
contain 4: false

equal_range

获取容器中等于给定key值的元素范围。返回第一个迭代器指向范围的首元素,第二个迭代器指向范围的最后一个元素后面的位置。代码示例:

std::unordered_multiset<int> s{1, 1, 2, 3, 3, 4};
for (auto item : s)
{std::cout << item << " ";
}
std::cout << std::endl;
auto [iter1, iter2] = s.equal_range(3);
std::cout << "iter1 = " << *iter1 << std::endl;
std::cout << "iter2 = " << *iter2 << std::endl;

桶接口

bucket_count

返回unordered_multiset的桶数量。代码示例:

std::unordered_multiset<int> s{1, 1, 2, 3, 3, 3, 3};
std::cout << "bucket count = " << s.bucket_count() << std::endl;

输出结果:

bucket count = 11

max_bucket_count

返回unordered_multiset可以容纳的最大桶数量。代码示例:

std::unordered_multiset<int> s1;
std::unordered_multiset<std::string> s2;
std::cout << "s1 max bucket count: " << s1.max_bucket_count() << std::endl;
std::cout << "s2 max bucket count: " << s2.max_bucket_count() << std::endl;

输出结果:

s1 max bucket count: 768614336404564650
s2 max bucket count: 461168601842738790

bucket_size

范围特定桶中的元素数量。代码示例:

std::unordered_multiset<int> s{1, 1, 1, 2, 2, 2, 3, 3};
for (int i = 0; i < s.bucket_count(); ++i)
{std::cout << "bucket " << i << " has item num " << s.bucket_size(i)<< std::endl;
}

输出结果:

bucket 0 has item num 0
bucket 1 has item num 3
bucket 2 has item num 3
bucket 3 has item num 2
bucket 4 has item num 0
bucket 5 has item num 0
bucket 6 has item num 0
bucket 7 has item num 0
bucket 8 has item num 0
bucket 9 has item num 0
bucket 10 has item num 0

bucket

返回给定key值的元素所在桶的索引。代码示例:

std::unordered_multiset<int> s{11, 11, 13, 13, 13, 14, 14, 15};
auto n = s.bucket(13);
std::cout << "item 13 is in bucket " << n << std::endl;

输出结果:

item 13 is in bucket 2

begin、cbegin、end、cend

begin和cbegin返回索引为n的桶中的首个元素的迭代器。end和cend返回索引为n的桶中的末尾迭代器。代码示例:

std::unordered_multiset<int> s{11, 11, 13, 13, 13, 14, 14, 15};
auto cnt = s.bucket(13);
auto iter_begin = s.begin(cnt);
auto iter_end = s.end(cnt);
for (auto iter = iter_begin; iter != iter_end; ++iter)
{std::cout << "num = " << *iter << std::endl;
}

输出结果:

num = 13
num = 13
num = 13

哈希策略

load_factor

返回每个桶的平均元素数量。代码示例:

std::unordered_multiset<int> s{1, 1, 2, 3};
float num = s.load_factor();
std::cout << "load factor is: " << num << std::endl;

输出结果:

load factor is: 0.8

max_load_factor

没有参数的情况下返回每个桶的最大平均元素数。参数为float类型时设置每个桶的最大平均元素数,如果超出了该数量,容器就会自己增加桶数。代码示例:

int n_count = 200;std::unordered_multiset<int> s1;
s1.max_load_factor(1);
for (int i = 0; i < n_count; ++i)
{s1.insert(i);
}
std::cout << "s1 max load factor is: " << s1.max_load_factor() << std::endl;
std::cout << "s1 bucket count: " << s1.bucket_count() << std::endl;std::unordered_multiset<int> s2;
s2.max_load_factor(20);
for (int i = 0; i < n_count; ++i)
{s2.insert(i);
}
std::cout << "s2 max load factor is: " << s2.max_load_factor() << std::endl;
std::cout << "s2 bucket count: " << s2.bucket_count() << std::endl;

输出结果:

s1 max load factor is: 1
s1 bucket count: 397
s2 max load factor is: 20
s2 bucket count: 11

rehash

设置桶的最小数量并重新散列容器。代码示例:

std::unordered_multiset<int> s;
for (int i = 0; i < 200; ++i)
{s.insert(i);
}
std::cout << "bucket cnt: " << s.bucket_count() << std::endl;s.rehash(s.bucket_count() / 2);
std::cout << "bucket cnt: " << s.bucket_count() << std::endl;
s.rehash(s.bucket_count() * 4);
std::cout << "bucket cnt: " << s.bucket_count() << std::endl;

输出结果:

bucket cnt: 397
bucket cnt: 211
bucket cnt: 853

reserve

设置桶的最小元素个数,并重新散列容器。重新散列后的容器的平均桶数不能超过设定的值。代码示例:

std::unordered_multiset<int> s;
for (int i = 0; i < 200; ++i)
{s.insert(i);
}
std::cout << "bucket cnt: " << s.load_factor() << std::endl;s.reserve(5);
std::cout << "bucket cnt: " << s.load_factor() << std::endl;

输出结果:

bucket cnt: 0.503778
bucket cnt: 0.947867

观察器

hash_function

返回计算hash值的函数。代码示例:

std::unordered_multiset<std::string> s;
auto hash_func = s.hash_function();
std::cout << "hash is: " << hash_func("hello world") << std::endl;

输出结果:

hash is: 12386028635079221413

key_eq

返回用于比较key相等性的函数。代码示例:

std::unordered_multiset<int> s;
auto key_eq_func = s.key_eq();
std::cout << std::boolalpha;
std::cout << key_eq_func(1, 1) << std::endl;
std::cout << key_eq_func(1, 2) << std::endl;

输出结果:

true
false

非成员函数

比较运算符

比较两个unordered_multiset是否相等。代码示例:

std::unordered_multiset<int> s1{1, 1, 2};
std::unordered_multiset<int> s2{1, 2};
std::cout << std::boolalpha;
std::cout << "s1 == s2: " << (s1 == s2) << std::endl;
std::cout << "s1 != s2: " << (s1 != s2) << std::endl;

输出结果:

s1 == s2: false
s1 != s2: true

swap

交换两个容器的元素内容。代码示例:

std::unordered_multiset<int> s1{1, 1, 2};
std::unordered_multiset<int> s2{1, 2};
std::swap(s1, s2);
std::cout << "s1 size = " << s1.size() << std::endl;
std::cout << "s2 size = " << s2.size() << std::endl;

输出结果:

s1 size = 2
s2 size = 3

enable_if

删除满足条件的元素。代码示例:

std::unordered_multiset<int> s = {1, 1, 2, 3, 3};
std::cout << "s size = " << s.size() << std::endl;
std::erase_if(s,[](int a){return a > 2;});
std::cout << "s size = " << s.size() << std::endl;

输出结果:

s size = 5
s size = 3

相关文章:

容器库(12)-std::unordered_multiset

unordered_multiset是以key为元素无序的关联容器&#xff0c;搜索、移除和插入操作是平均常数的时间复杂度。unordered_multiset在内部没有按任何顺序排列&#xff0c;而是放在桶当中的&#xff0c;放进哪个桶是通过计算key的hash值来决定的。和unordered_set不同的是&#xff…...

Mysql学习之事务日志undolog深入剖析

Undo log redo log 是事务持久性的保证&#xff0c;undo log是事务原子性的保证。在事务中更新数据的前置操作其实是要先写入一个undo log。 如何理解undo 日志&#xff1f; 事务需要保证原子性&#xff0c;也就是事务中的操作要么全部完成&#xff0c;要么什么也不做。但有时…...

springboot整合druid及可能遇到的问题

第一步&#xff0c;导入druid的maven依赖 在这里&#xff0c;我们选择导入druid-spring-boot-starter&#xff0c;使用配置文件的形式进行配置&#xff08;不需要再编写配置类&#xff09; <dependency><groupId>com.alibaba</groupId><artifactId>dr…...

c++文件的打开、读写和关闭。缓冲区的使用和控制。

在C中&#xff0c;文件的打开、读写和关闭通常使用标准库中的文件流对象&#xff08;如std::ifstream用于输入文件&#xff0c;std::ofstream用于输出文件&#xff09;来完成。这些对象封装了与操作系统交互的底层细节&#xff0c;使得文件操作更为简单和安全。 以下是文件打开…...

网络层的DDoS攻击与应用层的DDoS攻击之间的区别

DDoS攻击&#xff08;即“分布是拒绝服务攻击”&#xff09;&#xff0c;是基于DoS的特殊形式的拒绝服务攻击&#xff0c;是一种分布式、协作的大规模攻击方式&#xff0c;主要瞄准一些企业或政府部门的网站发起攻击。根据攻击原理和方式的区别&#xff0c;可以把DDoS攻击分为两…...

Windows系统安全策略设置之本地NTLM重放提权

经安全部门研究分析&#xff0c;近期利用NTLM重放机制入侵Windows 系统事件增多&#xff0c;入侵者主要通过Potato程序攻击拥有SYSTEM权限的端口伪造网络身份认证过程&#xff0c;利用NTLM重放机制骗取SYSTEM身份令牌&#xff0c;最终取得系统权限&#xff0c;该安全风险微软并…...

AI云增强升级!还原生动人像,拍出质感照片

近期不少细心用户发现&#xff0c;在用HUAWEI Mate 60 Pro手机拍照后&#xff0c;使用相册中的AI云增强功能&#xff0c;照片变得更加细腻有质感。这是因为AI云增强升级并更新支持了人像模式拍摄的照片&#xff0c;高清自然的人像细节还原和单反级别的光学景深效果&#xff0c;…...

PHP WebSocket:技术解析与实用指南

本文旨在帮助初学者掌握在PHP中使用WebSocket的关键概念和技术。我们将深入讨论从建立连接、绑定到监听等各方面的操作&#xff0c;并提供易于理解和实践的指导。 一、socket协议的简介 WebSocket是什么&#xff0c;有什么优点 WebSocket是一个持久化的协议&#xff0c;这是…...

K8S实战:Centos7部署Kubernetes1.24.0集群

本人在参考Kubernetes(k8s) 1.24.0版本基于Containerd的集群安装部署部署Kubernetes1.24.0集群时&#xff0c;遇到几个问题&#xff0c;下面将要注意的点罗列在下面&#xff1a; 集群需要配置hosts,如下所示&#xff0c;IP根据自己的实际情况填写&#xff0c;否则在kubeadm in…...

webpack的使用(中)

前言&#xff1a;&#xff08;承接webpack的使用(上)&#xff09;在实际开发过程中&#xff0c;webpack 默认只能打包处理以 .js 后缀名结尾的模块&#xff0c;其他非 js 后缀名结尾的模块&#xff0c;webpack 默认处理不了&#xff0c;需要调用 loader 加载器才可以正常打包&a…...

matlab经验模式分解的R波检测算法

1、内容简介 略 56-可以交流、咨询、答疑 2、内容说明 略 心血管疾病是威胁人类生命的主要疾病之一&#xff0c;而心电信号&#xff08;electrocardiogram, ECG&#xff09; 则是评价心脏功能的主要依据&#xff0c;因此&#xff0c;关于心电信号检测处理的研究一直为各方所…...

win10编译openjdk源码

上篇文章作者在ubuntu系统上实践完成openjdk源码的编译&#xff0c;但是平常使用更多的是window系统&#xff0c;ubuntu上编译出来JDK无法再windows上使用。所以作者又花费了很长时间在windows系统上完成openjdk源码的编译&#xff0c;陆续花费一个月的时间终于完成了编译。 本…...

mysql 自定义函数create function

方便后续查询&#xff0c;做以下记录&#xff1b; 自定义函数是一种与存储过程十分相似的过程式数据库对象&#xff0c; 它与存储过程一样&#xff0c;都是由 SQL 语句和过程式语句组成的代码片段&#xff0c;并且可以被应用程序和其他 SQL 语句调用。 自定义函数与存储过程之间…...

【析】装卸一体化车辆路径问题的自适应并行遗传算法

0 引言 国内外有关 &#xff36;&#xff32;&#xff30;&#xff33;&#xff30;&#xff24;的文献较多&#xff0c;求解目标多以最小化车辆行驶距离为主&#xff0c;但现实中可能存在由租赁费用产生的单次派出成本&#xff0c;需要综合考 虑单次派车成本和配送路径成本。…...

react项目中的redux以及react-router-dom

扫盲知识点&#xff1a; 1 传递自定义事件&#xff1a; <button onClick{(e)>{change(e)}}>获取事件对象e</button> 将事件对象e传递到了change的这个方法中。 2 同时传递自定义事件和参数&#xff1a; <button onClick{(e)>{change(‘我…...

django学习网址

https://www.django.cn/ Django中文网 https://docs.djangoproject.com/zh-hans/5.0/ Django 教程 | 菜鸟教程 (runoob.com) https://gitee.com/djangoadmin/DjangoAdmin_Django_Layui DjangoStarter: 基于Django定制的快速Web开发模板&#xff0c;功能包括&#xff1a;Do…...

@ 代码随想录算法训练营第4周(C语言)|Day21(二叉树)

代码随想录算法训练营第4周&#xff08;C语言&#xff09;|Day21&#xff08;二叉树&#xff09; Day21、二叉树&#xff08;包含题目 ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先 &#xff09; 530.二叉搜索树的最小绝对差 题目…...

Android的消息机制--Handler

一、四大组件概述 Android的消息机制是由Handler、Message、MessageQueue&#xff0c;Looper四个类支撑&#xff0c;撑起了Android的消息通讯机制&#xff0c;Android是一个消息驱动系统&#xff0c;由这几个类来驱动消息与事件的执行 Handler&#xff1a; 用来发送消息和处…...

获取用户信息与token理解

获取用户信息和token是在开发Web应用程序时常见的需求&#xff0c;可以通过以下步骤来实现&#xff1a; 用户登录&#xff1a;用户在应用程序中输入用户名和密码进行登录验证。一旦验证成功&#xff0c;应用程序会生成一个唯一的token&#xff0c;并将其返回给客户端。存储tok…...

网络设备和网络软件

文章目录 网络设备和网络软件网卡交换机交换机的三个主要功能交换机的工作原理第二层交换和第三层交换交换机的堆叠和级联 路由器路由器工作原理 网关网关的分类 无线接入点(AP)调制解调器网络软件 网络设备和网络软件 网卡 网络接口卡又称网络适配器&#xff0c;简称网卡。网…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...

Canal环境搭建并实现和ES数据同步

作者&#xff1a;田超凡 日期&#xff1a;2025年6月7日 Canal安装&#xff0c;启动端口11111、8082&#xff1a; 安装canal-deployer服务端&#xff1a; https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...