容器库(13)-std::unordered_multimap

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

template<class Key,class T,class Hash = std::hash<Key>,class KeyEqual = std::equal_to<Key>,class Allocator = std::allocator<std::pair<const Key, T>>
> class unordered_multimap;

本文章的代码库:

https://gitee.com/gamestorm577/CppStd

成员函数

构造、析构和赋值

构造函数

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

std::unordered_multimap<int, float> m1;
std::unordered_multimap<int, float> m2{{1, 1.1f}, {1, 1.2f}, {2, 1.3f}};
std::unordered_multimap<int, float> m3(m2);
std::unordered_multimap<int, float> m4(m2.begin(), std::next(m2.begin(), 2));std::cout << "m1 size = " << m1.size() << std::endl;
std::cout << "m2 size = " << m2.size() << std::endl;
std::cout << "m3 size = " << m3.size() << std::endl;
std::cout << "m4 size = " << m4.size() << std::endl;

输出结果:

m1 size = 0
m2 size = 3
m3 size = 3
m4 size = 2

对于自定义的类型,需要定义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_multimap<MyStruct, int, MyHash, MyEqual> m;

析构函数

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

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_multimap<MyStruct, float, MyHash, MyEqual> m;
m.emplace(MyStruct(1), 1.1f);
m.emplace(MyStruct(1), 2.1f);
m.emplace(MyStruct(2), 3.1f);
std::cout << "end" << std::endl;

输出结果:

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

赋值函数

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

std::unordered_multimap<int, float> tmp{{1, 1.1f}, {1, 1.2f}, {2, 1.3f}};
std::unordered_multimap<int, float> m1;
std::unordered_multimap<int, float> m2;
m1 = tmp;
m2 = {{1, 1.1f}, {2, 1.2f}};
std::cout << "m1 size = " << m1.size() << std::endl;
std::cout << "m2 size = " << m2.size() << std::endl;

输出结果:

m1 size = 3
m2 size = 2

迭代器

接口begin、cbegin指向容器起始的迭代器,end、cend指向末尾的迭代器。代码示例:

std::unordered_multimap<int, float> tmp{{1, 1.1f}, {1, 1.2f}, {3, 1.3f}};
for (auto iter = tmp.begin(); iter != tmp.end(); ++iter)
{iter->second += 10.f;
}for (auto iter = tmp.cbegin(); iter != tmp.cend(); ++iter)
{std::cout << "value = " << iter->second << std::endl;
}

输出结果:

value = 11.3
value = 11.1
value = 11.2

容器

empty

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

std::unordered_multimap<int, float> m1{{1, 1.1f}, {1, 1.2f}, {3, 1.3f}};
std::unordered_multimap<int, float> m2;
std::cout << std::boolalpha;
std::cout << "m1 empty: " << m1.empty() << std::endl;
std::cout << "m2 empty: " << m2.empty() << std::endl;

输出结果:

m1 empty: false
m2 empty: true

size

返回容器的元素个数。代码示例:

std::unordered_multimap<int, float> m1{{1, 1.1f}, {1, 1.2f}, {3, 1.3f}};
std::unordered_multimap<int, float> m2;
std::cout << "m1 size: " << m1.size() << std::endl;
std::cout << "m2 size: " << m2.size() << std::endl;

输出结果:

m1 size: 3
m2 size: 0

max_size

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

std::unordered_multimap<char, char> m1;
std::unordered_multimap<double, double> m2;
std::cout << "m1 max size = " << m1.max_size() << std::endl;
std::cout << "m2 max size = " << m2.max_size() << std::endl;

输出结果:

m1 max size = 768614336404564650
m2 max size = 576460752303423487

修改器

clear

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

std::unordered_multimap<int, float> m{{1, 1.1f}, {1, 1.2f}, {3, 1.3f}};
std::cout << "m size = " << m.size() << std::endl;
m.clear();
std::cout << "m size = " << m.size() << std::endl;

输出结果:

m size = 3
m size = 0

insert

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

std::unordered_multimap<int, float> m1{{1, 1.1f}, {2, 1.2f}};
std::unordered_multimap<int, float> m2{{1, 1.1f}, {2, 1.2f}};
std::cout << "m1 size = " << m1.size() << std::endl;
m1.insert(m2.begin(), m2.end());
std::cout << "m1 size = " << m1.size() << std::endl;
m1.insert({1, 1.2f});
std::cout << "m1 size = " << m1.size() << std::endl;

输出结果:

m1 size = 2
m1 size = 4
m1 size = 5

emplace

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

std::unordered_multimap<int, float> m{{1, 1.1f}, {2, 1.2f}};
m.emplace(1, 1.5f);
m.emplace(2, 2.5f);
for (auto& [key, value] : m)
{std::cout << "key: " << key << ", value: " << value << std::endl;
}

输出结果:

key: 2, value: 1.2
key: 2, value: 2.5
key: 1, value: 1.1
key: 1, value: 1.5

emplace_hint

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

不同的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 = 1000000;auto unordered_multimap_emplace = [=]() -> std::size_t
{std::unordered_multimap<int, float> m;for (int i = 0; i < count; ++i){m.emplace(i, 1.1f);}return m.size();
};auto unordered_multimap_emplace_hint1 = [=]() -> std::size_t
{std::unordered_multimap<int, float> m;auto iter = m.begin();for (int i = 0; i < count; ++i){m.emplace_hint(iter, i, 1.1f);iter = m.end();}return m.size();
};auto unordered_multimap_emplace_hint2 = [=]() -> std::size_t
{std::unordered_multimap<int, float> m;auto iter = m.begin();for (int i = 0; i < count; ++i){m.emplace_hint(iter, i, 1.1f);iter = m.begin();}return m.size();
};auto unordered_multimap_emplace_hint3 = [=]() -> std::size_t
{std::unordered_multimap<int, float> m;auto iter = m.begin();for (int i = 0; i < count; ++i){iter = m.emplace_hint(iter, i, 1.1f);}return m.size();
};timer(unordered_multimap_emplace, "unordered_multimap_emplace");
timer(unordered_multimap_emplace_hint1, "unordered_multimap_emplace_hint1");
timer(unordered_multimap_emplace_hint2, "unordered_multimap_emplace_hint2");
timer(unordered_multimap_emplace_hint3, "unordered_multimap_emplace_hint3");

输出结果:

unordered_multimap_emplace, size: 1000000, use time: 192.404
unordered_multimap_emplace_hint1, size: 1000000, use time: 234.959
unordered_multimap_emplace_hint2, size: 1000000, use time: 249.606
unordered_multimap_emplace_hint3, size: 1000000, use time: 227.878

erase

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

std::unordered_multimap<int, float> m1{{1, 1.1f}, {2, 1.2f}, {3, 1.3f}, {4, 1.4f}};
std::cout << "m1 size = " << m1.size() << std::endl;
m1.erase(m1.begin());
std::cout << "m1 size = " << m1.size() << std::endl;
m1.erase(m1.begin(), std::next(m1.begin(), 2));
std::cout << "m1 size = " << m1.size() << std::endl;std::unordered_multimap<int, float> m2{{1, 1.1f}, {1, 1.2f}, {2, 1.3f}, {2, 1.4f}};
std::cout << "m2 size = " << m2.size() << std::endl;
m2.erase(1);
std::cout << "m2 size = " << m2.size() << std::endl;

输出结果:

m1 size = 4
m1 size = 3
m1 size = 1
m2 size = 4
m2 size = 2

swap

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

std::unordered_multimap<int, float> m1{{1, 1.1f}, {1, 1.2f}, {3, 1.3f}};
std::unordered_multimap<int, float> m2{{1, 1.1f}, {1, 1.2f}};
m1.swap(m2);
std::cout << "m1 size = " << m1.size() << std::endl;
std::cout << "m2 size = " << m2.size() << std::endl;

输出结果:

m1 size = 2
m2 size = 3

extract

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

std::unordered_multimap<int, float> m{{1, 1.1f}, {1, 1.2f}, {3, 1.3f}};
auto node1 = m.extract(m.begin());
std::cout << "node1 key: " << node1.key() << ", value: " << node1.mapped()<< std::endl;
std::cout << "m size " << m.size() << std::endl;
auto node2 = m.extract(m.begin()->first);
std::cout << "m size " << m.size() << std::endl;
node2.key() += 20;
node2.mapped() += 20;
m.insert(std::move(node2));
std::cout << "m size " << m.size() << std::endl;
for (auto& [key, value] : m)
{std::cout << "key: " << key << ", value: " << value << std::endl;
}

输出结果:

node1 key: 3, value: 1.3
m size 2
m size 1
m size 2
key: 1, value: 1.2
key: 21, value: 21.1

merge

合并另一个unordered_map或者unordered_multimap的元素。代码示例:

std::unordered_multimap<int, float> m1{{1, 1.1f}, {2, 1.2f}};
std::unordered_multimap<int, float> m2{{1, 1.2f}, {2, 1.3f}};
m1.merge(m2);
std::cout << "m1 size = " << m1.size() << std::endl;
std::cout << "m2 size = " << m2.size() << std::endl;

输出结果:

m1 size = 4
m2 size = 0

查找

count

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

std::unordered_multimap<int, float> m{{1, 1.1f}, {1, 1.2f}, {3, 1.3f}};
std::cout << "m key 1 count: " << m.count(1) << std::endl;
std::cout << "m key 3 count: " << m.count(3) << std::endl;
std::cout << "m key 4 count: " << m.count(4) << std::endl;

输出结果:

m key 1 count: 2
m key 3 count: 1
m key 4 count: 0

find

获取指定key值的元素的迭代器。代码示例:

std::unordered_multimap<int, float> m{{1, 1.1f}, {1, 1.2f}, {3, 1.3f}};
auto iter1 = m.find(1);
auto iter2 = m.find(4);
std::cout << std::boolalpha;
std::cout << "elment has key 1: " << (iter1 == m.end()) << std::endl;
std::cout << "elment has key 4: " << (iter2 == m.end()) << std::endl;

输出结果:

elment has key 1: false
elment has key 4: true

contains

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

std::unordered_multimap<int, float> m{{1, 1.1f}, {1, 1.2f}, {3, 1.3f}};
std::cout << std::boolalpha;
std::cout << "contain key 1: " << m.contains(1) << std::endl;
std::cout << "contain key 4: " << m.contains(4) << std::endl;

输出结果:

contain key 1: true
contain key 4: false

equal_range

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

std::unordered_multimap<int, float> m{{1, 1.1f}, {2, 1.2f}, {2, 1.3f}, {2, 1.4f}, {5, 1.5f}};
for (auto item : m)
{std::cout << item.first << " ";
}
std::cout << std::endl;auto [iter1, iter2] = m.equal_range(2);
for (auto iter = iter1; iter != iter2; ++iter)
{std::cout << "k: " << iter->first << ", val: " << iter->second << "\n";
}

输出结果:

5 2 2 2 1 
k: 2, val: 1.2
k: 2, val: 1.3
k: 2, val: 1.4

桶接口

bucket_count

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

std::unordered_multimap<int, float> m{{1, 1.1f}, {1, 1.2f}, {3, 1.3f}};
std::cout << "bucket count = " << m.bucket_count() << std::endl;

输出结果:

bucket count = 5

max_bucket_count

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

std::unordered_multimap<int, float> m;
std::cout << "max bucket count = " << m.max_bucket_count() << std::endl;

输出结果:

max bucket count = 768614336404564650

bucket_size

返回给定索引的桶中的元素数量。代码示例:

std::unordered_multimap<int, float> m{{1, 1.1f}, {1, 1.2f}, {3, 1.3f}};
for (int i = 0; i < m.bucket_count(); ++i)
{std::cout << "bucket " << i << " has item num " << m.bucket_size(i)<< std::endl;
}

输出结果:

bucket 0 has item num 0
bucket 1 has item num 2
bucket 2 has item num 0
bucket 3 has item num 1
bucket 4 has item num 0

bucket

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

std::unordered_multimap<int, float> m{{11, 1.1f}, {11, 1.2f}, {12, 1.3f}};
auto n = m.bucket(11);
std::cout << "item 11 is in bucket " << n << std::endl;

输出结果:

item 11 is in bucket 1

begin、cbegin、end、cend

std::unordered_multimap<int, float> m{{11, 1.1f}, {11, 1.2f}, {31, 1.3f}, {31, 1.1f}, {52, 1.2f}};
auto cnt = m.bucket(31);
auto iter_begin = m.begin(cnt);
auto iter_end = m.end(cnt);
for (auto i = iter_begin; i != iter_end; ++i)
{std::cout << "k: " << i->first << ", val: " << i->second << std::endl;
}

输出结果:

k: 11, val: 1.1
k: 11, val: 1.2
k: 31, val: 1.3
k: 31, val: 1.1

散列策略

load_factor

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

std::unordered_multimap<int, float> m{{11, 1.1f}, {11, 1.2f}, {31, 1.3f}};
float num = m.load_factor();
std::cout << "load factor is: " << num << std::endl;

输出结果:

load factor is: 0.6

max_load_factor

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

int n_count = 200;std::unordered_multimap<int, float> m1;
m1.max_load_factor(1);
for (int i = 0; i < n_count; ++i)
{m1.emplace(i, 1.0f);
}
std::cout << "m1 max load factor is: " << m1.max_load_factor() << std::endl;
std::cout << "m1 bucket count: " << m1.bucket_count() << std::endl;std::unordered_multimap<int, float> m2;
m2.max_load_factor(20);
for (int i = 0; i < n_count; ++i)
{m2.emplace(i, 1.0f);
}
std::cout << "m2 max load factor is: " << m2.max_load_factor() << std::endl;
std::cout << "m2 bucket count: " << m2.bucket_count() << std::endl;

输出结果:

m1 max load factor is: 1
m1 bucket count: 397
m2 max load factor is: 20
m2 bucket count: 11

rehash

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

std::unordered_multimap<int, float> m;
for (int i = 0; i < 200; ++i)
{m.emplace(i, 1.0f);
}
std::cout << "bucket cnt: " << m.bucket_count() << std::endl;m.rehash(m.bucket_count() / 2);
std::cout << "bucket cnt: " << m.bucket_count() << std::endl;
m.rehash(m.bucket_count() * 4);
std::cout << "bucket cnt: " << m.bucket_count() << std::endl;

输出结果:

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

reserve

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

std::unordered_multimap<int, float> m;
for (int i = 0; i < 200; ++i)
{m.emplace(i, 1.0f);
}
std::cout << "bucket cnt: " << m.load_factor() << std::endl;m.rehash(5);
std::cout << "bucket cnt: " << m.load_factor() << std::endl;

输出结果:

bucket cnt: 0.503778
bucket cnt: 0.947867

观察器

hash_function

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

std::unordered_multimap<std::string, float> m;
auto hash_func = m.hash_function();
std::cout << "hash is: " << hash_func("hello world") << std::endl;

输出结果:

hash is: 12386028635079221413

key_eq

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

std::unordered_multimap<int, std::string> m;
auto key_eq_func = m.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

非成员函数

比较运算符

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

std::unordered_multimap<int, float> m1{{1, 1.1f}, {1, 1.2f}, {3, 1.3f}};
std::unordered_multimap<int, float> m2{{1, 1.1f}, {1, 1.2f}};
std::cout << std::boolalpha;
std::cout << "m1 == m2: " << (m1 == m2) << std::endl;
std::cout << "m1 != m2: " << (m1 != m2) << std::endl;

输出结果:

m1 == m2: false
m1 != m2: true

swap

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

std::unordered_multimap<int, float> m1{{1, 1.1f}, {1, 1.2f}, {3, 1.3f}};
std::unordered_multimap<int, float> m2{{1, 1.1f}, {1, 1.2f}};
std::swap(m1, m2);
std::cout << "m1 size = " << m1.size() << std::endl;
std::cout << "m2 size = " << m2.size() << std::endl;

输出结果:

m1 size = 2
m2 size = 3

erase_if

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

std::unordered_multimap<int, float> m{{1, 1.1f}, {1, 1.2f}, {3, 1.3f}};
std::cout << "m size = " << m.size() << std::endl;
std::erase_if(m,[](const std::pair<int, float>& pair){return pair.second > 1.15;});
std::cout << "m size = " << m.size() << std::endl;

输出结果:

m size = 3
m size = 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/704238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python算法题集_全排列

Python算法题集_全排列 题46&#xff1a;全排列1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【标记数组递归】2) 改进版一【指针递归】3) 改进版二【高效迭代模块】4) 改进版三【高效迭代模块极简代码】 4. 最优算法5. 相关资源 本文为Python…

《剑指 Offer》专项突破版 - 面试题 59、60 和 61 : 详解堆的应用(C++ 实现)

目录 前言 面试题 59 : 数据流的第 k 大数字 面试题 60 : 出现频率最高的 k 个数字 面试题 61 : 和最小的 k 个数对 前言 堆最大的特点是最大值或最小值位于堆的顶部&#xff0c;只需要 O(1) 的时间就可以求出一个数据集合中的最大值或最小值&#xff0c;同时在堆中添加或…

金融保险领域统一消息发送平台

项目介绍&#xff1a;系统为金融保险行业统一推送基础平台&#xff0c;日均推送消息2000万条&#xff0c;支持短信、官微、邮件多种发送渠道。 项目定位&#xff1a;结合公司项目产品化战略&#xff0c;从基础的推送能力出发&#xff0c;形成公司的统一推送基础产品 项目功能…

STM32F103学习笔记(六) RTC实时时钟(应用篇)

目录 1. RTC 实时时钟的应用场景 2. RTC 的配置与初始化 2.1 设置 RTC 时钟源 2.2 初始化 RTC 寄存器 2.3 中断配置 2.4 备份寄存器配置 2.5 校准 RTC 3. 实例演示代码 4. 总结 1. RTC 实时时钟的应用场景 实时时钟&#xff08;RTC&#xff09;在嵌入式系统中具有广泛…

用C#开发Excel插件的强大开源工具

推荐一个开源项目&#xff0c;方便我们使用C#为Excel开发插件。 01 项目简介 Excel-DNA是一个.Net开源项目&#xff0c;为开发者提供了一种便利的方法&#xff0c;可以将.Net代码与Excel集成&#xff0c;能够轻松的为Excel创建自定义函数、图表、表单等&#xff0c;一方面不仅…

VS2022调试技巧(一)

什么是bug&#xff1f; 在1945年&#xff0c;美国科学家Grace Hopper在进行计算机编程时&#xff0c;发现一只小虫子钻进了一个真空管&#xff0c;导致计算机无法正常工作。她取出虫子后&#xff0c;计算机恢复了正常&#xff0c;由此&#xff0c;她首次将“Bug”这个词用来描…

【C语言基础】:操作符详解(二)

文章目录 操作符详解一、上期扩展二、单目操作符三、逗号表达式四、下标访问[]、 函数调用()五、结构成员访问操作符六、操作符的属性&#xff1a;优先级、结合性1. 优先级2. 结合性 操作符详解 上期回顾&#xff1a;【C语言基础】&#xff1a;操作符详解(一) 一、上期扩展 …

https://htmlunit.sourceforge.io/

https://htmlunit.sourceforge.io/ 爬虫 HtmlUnit – Welcome to HtmlUnit HtmlUnit 3.11.0 API https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit/2.70.0 https://s01.oss.sonatype.org/service/local/repositories/releases/content/org/htmlunit…

进程间通信学习笔记(有名管道和无名管道)

进程间通信方式&#xff1a; 无名管道(pipe)有名管道(fifo)信号(signal)共享内存(mmap)套接字(socket) 无名管道&#xff1a; 在内核里面开辟一片内存&#xff0c;进程1和进程2都可以通过这片内存进行通信 无名管道特点&#xff1a; 只能用于具有亲缘关系的进程之间的通信&am…

YOLOv9图像标注和格式转换

一、软件安装 labelimg安装&#xff08;anaconda&#xff09; 方法一、 pip install labelImg 方法二、 pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install pyqt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install lxml -i ht…

从Unity到Three.js(shader创建)

本文介绍three.js 中shader的创建和应用到模型&#xff0c;具体shader的语法和函数应用&#xff0c;已经有很多大佬总结过了。 three.js shader详解 import * as THREE from three;const scene new THREE.Scene();//创建场景 scene.backgroundnew THREE.Color(0,0.1,0.2,1);/…

系统找不到xinput1_3.dll怎么办?试试这五种解决方法轻松搞定

在计算机系统运行过程中&#xff0c;当我们遭遇“找不到xinput1_3.dll”这一错误提示时&#xff0c;实际上正面临一个软件兼容性、系统组件缺失以及游戏或应用程序无法正常启动的关键问题。深入探究这一现象&#xff0c;我们会发现它可能引发一系列连带问题&#xff0c;例如某些…

linux之前后端项目部署与发布

目录 前言 简介 一、安装Nginx 二、后端部署 2.1多个tomcat负载均衡 2.2 负载均衡 2.3 后端项目部署 三、前端部署 1.解压前端 2.Nginx配置文件修改 3.IP域名映射 4.重启Nginx服务 前言 上篇博主已经讲解过了单机项目的部署linux之JAVA环境配置JDK&Tomcat&a…

车载终端_联发科MTK6762车载平板电脑解决方案

智能车载终端方案搭载了MTK联发科8xARM Cortex-A53(64bit)高速CPU&#xff0c;采用12nm工艺制程&#xff0c;提供更快的数据采集速度和APP响应速度&#xff0c;能够快速满足用户的应用需求。配备3GB RAM32GB ROM的低功耗EMCP一体化存储&#xff0c;性能良好&#xff0c;支持多任…

【LeetCode:2476. 二叉搜索树最近节点查询 + 中序遍历 + 有序表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

panelRef.value.getBoundingClientRect is not a function

<el-cascader-panel v-model"value" ref"panelRef" expand-change"expandChange" />const panelRef ref(null) panelRef.value.getBoundingClientRect()报错&#xff1a; panelRef.value.getBoundingClientRect is not a function 报错原…

python使用winio控制x86工控机的gpio

视频讲解 https://www.bilibili.com/video/BV1Nu4m1w7iv/?vd_source5ba34935b7845cd15c65ef62c64ba82f pywinio库 https://pypi.org/project/pywinio/ 安装库 pip install pywinio寄存器地址 测试代码 import pywinio winio get_winio() # 设置排针2输出1,0x40是bit6置…

嵌入式中逻辑分析仪基本操作方法

前期准备 1.一块能触摸的屏对应的主板机 2.逻辑分析仪对应的软件工具 3.对应的拓展板 4.确定拓展板的引脚分布情况 第一步&#xff1a;逻辑分析仪j基本操作 1.数据捕捉需要先进行对应软件安装,并按照需求进行配置 2.这里以A20为例:此手机使用显示驱动芯片CST148,触摸屏分辨…

插件废土课:打造属于你的“智能笔记”!

哎呀嘞&#xff0c;亲爱的网页冲浪者们&#xff0c;抓紧浮板&#xff0c;我们要继续在Chrome插件的海浪上翻滚啦&#xff01;上次我们玩了个小把戏&#xff0c;搞了个显示时间的Hello World插件&#xff0c;这次我们要把游戏玩大&#xff0c;准备打造一个能让你在网页上乱涂乱画…

Onlyfans信用卡支付失败怎么办?怎么订阅Onlyfans

OnlyFans信用卡支付失败解决方案及订阅指南 简介 OnlyFans是一个以内容创作者为重点的订阅平台&#xff0c;让用户可以通过支付订阅费用来获取独家内容。然而&#xff0c;有时候在进行信用卡支付时可能会遇到一些问题。本篇文章将为你提供解决OnlyFans信用卡支付失败的方案&a…