当前位置: 首页 > 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;简称网卡。网…...

全连接层是什么

个人浅显的看法: 当前层的每一个神经元&#xff0c;都和下一层的每一个神经元有连接&#xff0c;叫全连接层。 当前层有n个神经元&#xff0c;下一层有m个神经元&#xff0c;则全连接层&#xff0c;当前层的n个神经元和下一层m个神经元都有连接...

JAVA工程师面试专题-《Redis》篇

目录 一、基础 1、Redis 是什么 2、说一下你对redis的理解 3、Redis 为什么这么快&#xff1f; 4、项目中如何使用缓存&#xff1f; 5、为什么使用缓存&#xff1f; 6、Redis key 和value 可以存储最大值分别多是多少&#xff1f; 7、Redis和memcache有什么区别&#xf…...

JavaScript BOM

BOM&#xff1a;浏览器对象模型&#xff0c;可以让我们通过js来操作浏览器 window 代表整个浏览器窗口 同时也是页面中的全局对象 Location 代表浏览器地址栏信息 Navigator 代表浏览器信息 可以获取不同的浏览器信息 History 代表浏览器的历史记录 Screen 代表用户的屏幕信…...

uniapp微信小程序-项目实战修改密码

图标是使用uview里面的图标&#xff0c;icfont也可以 以下是所有代码 <template><view><!-- 密码三个 --><view class"password" v-for"(item,index) in userList"><view class"contentuser"><view class&qu…...

linux系统---防火墙拓展

目录 一、iptables 1.基本语法 2.四表五链——重点记忆 2.1四表 2.2五链 2.3总结 3.iptables选项示例 3.1 -Z 清空流量计数 3.2 -P 修改默认规则 3.3 -D 删除规则 3.4 -R 指定编号替换规则 4.白名单 5.通用匹配 6.示例 6.1添加回环网卡 6.2可以访问端口 6.3 主…...

就业的二三事

先说一下当前本人的情况&#xff1a;双非本一&#xff0c;研二在读&#xff0c;一篇图像处理方面的sci一区&#xff08;二作&#xff09;&#xff0c;日常工作语言为python&#xff0c;有过一段开源实习。要开始准备实习了&#xff0c;发个帖子记录一下自己所收集的信息。 前几…...

Go语言必知必会100问题-05 接口污染

接口污染 在Go语言中&#xff0c;接口是我们设计和编写代码的基石。然而&#xff0c;像很多概念一样&#xff0c;滥用它是不好的。接口污染是指用不必要的抽象来编写代码&#xff08;刻意使用接口&#xff09;&#xff0c;使得代码更难以理解。这是具有不同习惯&#xff0c;特…...

FastBee商业版本源码获取下载

一、系统功能 系统功能功能说明开源版本商业版本产品管理产品详情、产品物模型、产品分类、设备授权、产品固件支持支持设备管理设备详情、设备分组、设备日志、设备分享、设备实时控制、实时状态、数据监测支持支持物模型管理属性&#xff08;设备状态和监测数据&#xff09;…...

Java实战:Spring Boot集成Elasticsearch全文搜索引擎

本文将详细介绍如何在Spring Boot应用程序中集成Elasticsearch全文搜索引擎。我们将探讨Elasticsearch的基本概念&#xff0c;以及如何使用Spring Boot和Spring Data Elasticsearch模块来实现全文搜索功能。此外&#xff0c;我们将通过具体的示例来展示如何在Spring Boot应用程…...

python 进程笔记二(通讯) (概念+示例代码)

1、为什么要掌握进程间通信 Python代码效率由于受制于GIL全局锁限制&#xff0c;多线程不能利用多核CPU来加速&#xff0c;而多进程方式却可以绕过GIL限制, 发挥多CPU加速的优势&#xff0c;达到提高程序的性能的目的。 然而进程间通信却是不得不考虑的问题。 进程不同于线程&a…...

手机wap网站制作需要多少钱/搜索引擎是指什么

可以使用 clickhouse-client 命令行工具来导出 ClickHouse 表的数据。 使用方法如下&#xff1a; clickhouse-client --query"SELECT * FROM<database>.<table>" > <file>.csv...

织梦网站地图在线生成/国外seo

2019独角兽企业重金招聘Python工程师标准>>> 这里介绍两种安装方式&#xff1a;1.Python源代码编译安装和2.从epel仓库安装 一、Python源代码编译安装 1 - 安装必要工具yum-utils它的主要功能时管理repository及扩展包的工具 sudo yum install yum-utils 如果报错提…...

建设网站需要什么设备/乐陵seo外包

本教程向您展示如何将数据从 Elasticsearch 导出到 CSV 文件。 想象一下&#xff0c;您想要在 Excel 中打开一些 Elasticsearch 中的数据&#xff0c;并根据这些数据创建数据透视表。 这只是一个用例&#xff0c;其中将数据从 Elasticsearch 导出到 CSV 文件将很有用。 方法一 …...

殡葬网站建设/whois查询

JEPF软件快速开发平台学习心得之请假单功能的完成&#xff08;一&#xff09;首先我也是点一次接触这个软件快速开发平台&#xff0c;我在学习这个平台的同时简单记录下我对这个平台是如何一步步熟悉或者是上手的&#xff0c;也有简单的一点总结和学习心得&#xff0c;希望对你…...

wordpress 禁止自动保存 插件/网络营销策划书封面

变量变量&#xff1a;将运算的中间结果暂存到内存中&#xff0c;以便后续程序调用。变量的命令规则&#xff1a;变量由字母、数字、下划线组合而成。不可以数字开头&#xff0c;更不能全是数字。不能是python的关键字。不要用中文。名字要有意义。不要太长。区分大小写。推荐使…...

linux 建立网站/女孩子做运营是不是压力很大

oracle全文索引和定时任务--首先检查数据库中是否有CTXSYS用户和CTXAPP脚色。--如果没有这个用户和角色&#xff0c;意味着你的数据库创建时未安装intermedia功能。--你必须修改数据库以安装这项功能。--用sys用户为了用户gzinfo分配权限grantCTXAPP togzinfo;grantexecuteonct…...