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

(七)[重制]C++命名空间与标准模板库(STL)

引言

在专栏C++教程的第六篇C++中的结构体与联合体中,介绍了C++中的结构体和联合体,包括它们的定义、初始化、内存布局和对齐,以及作为函数参数和返回值的应用。在专栏C++教程的第七篇中,我们将深入了解C++中的命名空间(namespace)和标准模板库(STL)的相关概念和应用

C++ 命名空间(namespace)

C++ 命名空间在软件开发中起着至关重要的作用,特别是在大型项目中。命名空间的主要作用是解决全局名称冲突的问题。在大型项目中,不同模块可能定义了相同名称的函数、变量或类。通过将这些实体分别放入不同的命名空间内,可以在全局范围内区分它们。接下来,我们将详细介绍命名空间的相关内容,并通过生动有趣的示例来帮助理解。

1. 命名空间的作用

想象一下你正在开发一个复杂的应用程序,其中包括多个模块,如账户管理、交易处理、报告生成等。每个模块都有自己的一组函数和类,例如,Account 类在账户管理模块中用于表示用户账户,而在交易处理模块中,可能也有一个 Transaction 类表示金融交易。如果不使用命名空间,这些类名可能会发生冲突,从而导致编译错误或意外行为。

为了避免这种情况,我们可以将每个模块的代码放入不同的命名空间中:

namespace AccountManagement {class Account {// 账户管理相关代码};
}namespace TransactionProcessing {class Transaction {// 交易处理相关代码};
}

通过这种方式,即使两个模块中都有同名的类,它们也不会冲突。我们可以通过命名空间限定符来区分它们:

AccountManagement::Account myAccount;
TransactionProcessing::Transaction myTransaction;

2. 命名空间成员访问方式

在使用命名空间时,我们有多种方式访问其中的成员。

显式作用域解析运算符

最直接的方式是使用作用域解析运算符 :: 来显式指定命名空间:

namespace MyNamespace {void function() {// 函数实现}
}int main() {MyNamespace::function(); // 显式调用命名空间内的函数return 0;
}

using 声明

我们也可以使用 using 声明将特定的命名空间成员导入到当前作用域,这样就可以直接使用这些成员而无需每次都写命名空间前缀:

namespace MyNamespace {void function() {// 函数实现}
}using MyNamespace::function; // 导入特定函数到当前作用域int main() {function(); // 现在可以直接调用return 0;
}

using 指令

using namespace 语句用于导入整个命名空间的内容到当前作用域。尽管方便,但在头文件中使用可能会导致污染全局命名空间,增加编译错误和维护难度。因此,一般建议仅在实现文件中使用 using namespace,而在头文件中尽量避免。

namespace MyNamespace {void function() {// 函数实现}
}// 在 cpp 文件中使用
using namespace MyNamespace;int main() {function(); // 直接调用return 0;
}

3. 内联命名空间

C++11 引入了内联命名空间(inline namespace),它的主要特点是链接时不会创建新的作用域,而是保留原作用域。内联命名空间主要用于版本控制和 ABI 兼容性问题。

假设你在开发一个库,并希望在新版本中添加一些功能,但不希望破坏与旧版本的兼容性。你可以使用内联命名空间来实现这一点:

namespace MyLibrary {inline namespace v1 {void function() {// 旧版本实现}}inline namespace v2 {void function() {// 新版本实现}}
}int main() {MyLibrary::function(); // 调用新版本的实现return 0;
}

通过这种方式,用户可以选择性地使用旧版本或新版本的实现,而无需修改代码。

4. 匿名命名空间

匿名命名空间中的所有内容具有内部链接属性,意味着它们只在同一编译单元可见,这有助于实现文件私有数据。匿名命名空间常用于定义只在当前文件中使用的辅助函数或变量,避免它们在全局范围内被意外使用。

namespace {void helperFunction() {// 辅助函数实现}
}int main() {helperFunction(); // 调用匿名命名空间内的辅助函数return 0;
}

使用匿名命名空间可以有效地避免命名冲突,并确保辅助函数或变量只在当前文件中可见。

C++ 标准模板库(STL)详解

C++ 标准模板库(STL)是 C++ 标准库的一部分,提供了一组常用的数据结构和算法。STL 的设计原则是泛型编程,通过模板实现通用的容器和算法,使代码更加灵活和可重用。接下来,我们将详细介绍 STL 的各个方面,并通过生动有趣的示例来帮助理解。

1. STL 容器

STL 容器是 STL 的核心组件之一,每个容器都有其独特的特性和适用场景。以下是常用 STL 容器的介绍及示例。

std::vector

std::vector 是一种动态数组,支持高效的随机访问。它的插入和删除操作可能会导致元素移动,因此在需要频繁插入和删除的场景中性能不如链表。

#include <vector>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 访问元素std::cout << "Element at index 2: " << vec[2] << std::endl;// 插入元素vec.push_back(6);std::cout << "Last element: " << vec.back() << std::endl;// 删除元素vec.pop_back();std::cout << "After pop_back, last element: " << vec.back() << std::endl;return 0;
}

std::deque

std::deque 是一种双端队列,支持在两端进行高效的插入和删除操作。它既可以用作栈,也可以用作队列。

#include <deque>
#include <iostream>int main() {std::deque<int> deq = {1, 2, 3, 4, 5};// 访问元素std::cout << "Element at index 2: " << deq[2] << std::endl;// 在前端插入元素deq.push_front(0);std::cout << "First element: " << deq.front() << std::endl;// 在后端插入元素deq.push_back(6);std::cout << "Last element: " << deq.back() << std::endl;// 删除前端元素deq.pop_front();std::cout << "After pop_front, first element: " << deq.front() << std::endl;return 0;
}

std::list

std::list 是一种双向链表,支持高效的插入和删除操作,但不支持随机访问。它适用于需要频繁插入和删除元素的场景。

#include <list>
#include <iostream>int main() {std::list<int> lst = {1, 2, 3, 4, 5};// 遍历元素for (int elem : lst) {std::cout << elem << " ";}std::cout << std::endl;// 插入元素auto it = lst.begin();std::advance(it, 2);lst.insert(it, 10);// 删除元素lst.erase(it);// 遍历元素for (int elem : lst) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

std::set 和 std::map

std::setstd::map 是基于红黑树实现的有序容器,键唯一,自动排序。std::set 仅包含键,而 std::map 包含键值对。

#include <set>
#include <map>
#include <iostream>int main() {// std::set 示例std::set<int> mySet = {5, 3, 8, 1};mySet.insert(4);for (int elem : mySet) {std::cout << elem << " ";}std::cout << std::endl;// std::map 示例std::map<int, std::string> myMap;myMap[1] = "one";myMap[2] = "two";myMap[3] = "three";for (const auto& pair : myMap) {std::cout << pair.first <<" => " << pair.second << std::endl;}return 0;
}

std::multiset 和 std::multimap

std::multisetstd::multimap 允许键重复,其他特性与 std::setstd::map 相同。

#include <set>
#include <map>
#include <iostream>int main() {// std::multiset 示例std::multiset<int> myMultiSet = {5, 3, 8, 1, 3, 5};for (int elem : myMultiSet) {std::cout << elem << " ";}std::cout << std::endl;// std::multimap 示例std::multimap<int, std::string> myMultiMap;myMultiMap.insert({1, "one"});myMultiMap.insert({2, "two"});myMultiMap.insert({1, "uno"});for (const auto& pair : myMultiMap) {std::cout << pair.first << " => " << pair.second << std::endl;}return 0;
}

适配器容器

适配器容器是对其他容器的封装,提供特定的接口,例如栈(stack)、队列(queue)和优先级队列(priority_queue)。

#include <stack>
#include <queue>
#include <iostream>int main() {// 栈示例std::stack<int> myStack;myStack.push(1);myStack.push(2);myStack.push(3);while (!myStack.empty()) {std::cout << myStack.top() << " ";myStack.pop();}std::cout << std::endl;// 队列示例std::queue<int> myQueue;myQueue.push(1);myQueue.push(2);myQueue.push(3);while (!myQueue.empty()) {std::cout << myQueue.front() << " ";myQueue.pop();}std::cout << std::endl;// 优先级队列示例std::priority_queue<int> myPriorityQueue;myPriorityQueue.push(3);myPriorityQueue.push(1);myPriorityQueue.push(2);while (!myPriorityQueue.empty()) {std::cout << myPriorityQueue.top() << " ";myPriorityQueue.pop();}std::cout << std::endl;return 0;
}

2. STL 算法

STL 提供了丰富的算法库,包括非修改序列算法、修改序列算法、排序算法、数值算法等。这些算法通常与迭代器配合使用。

非修改序列算法

非修改序列算法不会改变容器的内容,它们通常用于查找、统计和检查元素。

#include <vector>
#include <algorithm>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5, 3};// 查找元素auto it = std::find(vec.begin(), vec.end(), 3);if (it != vec.end()) {std::cout << "Found 3 at index " << std::distance(vec.begin(), it) << std::endl;} else {std::cout << "3 not found" << std::endl;}// 统计元素个数int count = std::count(vec.begin(), vec.end(), 3);std::cout << "Number of 3s: " << count << std::endl;// 检查是否所有元素都大于 0bool allPositive = std::all_of(vec.begin(), vec.end(), [](int x) { return x > 0; });std::cout << "All elements are positive: " << (allPositive ? "true" : "false") << std::endl;return 0;
}

修改序列算法

修改序列算法会改变容器的内容,它们包括排序、复制、替换等操作。

#include <vector>
#include <algorithm>
#include <iostream>int main() {std::vector<int> vec = {4, 2, 5, 1, 3};// 排序std::sort(vec.begin(), vec.end());std::cout << "Sorted vector: ";for (int elem : vec) {std::cout << elem << " ";}std::cout << std::endl;// 反转std::reverse(vec.begin(), vec.end());std::cout << "Reversed vector: ";for (int elem : vec) {std::cout << elem << " ";}std::cout << std::endl;// 复制std::vector<int> vec2(vec.size());std::copy(vec.begin(), vec.end(), vec2.begin());std::cout << "Copied vector: ";for (int elem : vec2) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

排序算法

STL 提供了一些高级排序算法,例如 std::sortstd::stable_sort

#include <vector>
#include <algorithm>
#include <iostream>int main() {std::vector<int> vec = {4, 2, 5, 1, 3};// 使用 std::sort 排序std::sort(vec.begin(), vec.end());std::cout << "Sorted vector: ";for (int elem : vec) {std::cout << elem << " ";}std::cout << std::endl;// 使用 std::stable_sort 排序,保留相等元素的相对顺序std::stable_sort(vec.begin(), vec.end());std::cout << "Stable sorted vector: ";for (int elem : vec) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

数值算法

STL 还提供了一些数值算法,如 std::accumulate 用于求和,std::partial_sumstd::adjacent_difference 用于累积和差分。

#include <vector>
#include <numeric>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 求和int sum = std::accumulate(vec.begin(), vec.end(), 0);std::cout << "Sum: " << sum << std::endl;// 部分和std::vector<int> partialSums(vec.size());std::partial_sum(vec.begin(), vec.end(), partialSums.begin());std::cout << "Partial sums: ";for (int elem : partialSums) {std::cout << elem << " ";}std::cout << std::endl;// 相邻差分std::vector<int> differences(vec.size());std::adjacent_difference(vec.begin(), vec.end(), differences.begin());std::cout << "Adjacent differences: ";for (int elem : differences) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

3. STL 迭代器

迭代器是 STL 的核心概念之一,它提供了访问容器内元素的一致接口。STL 迭代器类似于指针,但具有更多的功能。根据迭代器的能力,它们分为以下几种类型:

输入迭代器

输入迭代器只能读取元素并单向前进,适用于单次遍历序列的操作。

#include <vector>
#include <iostream>
#include <iterator>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用输入迭代器遍历向量for (std::istream_iterator<int> it(std::cin), end; it != end; ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

输出迭代器

输出迭代器只能写入元素并单向前进,适用于将结果输出到序列的操作。

#include <vector>
#include <iostream>
#include <iterator>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用输出迭代器将向量元素输出到标准输出std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));std::cout << std::endl;return 0;
}

前向迭代器

前向迭代器除了输入迭代器的功能外,还可以前进后再次前进,适用于多次遍历序列的操作。

#include <vector>
#include <iostream>
#include <iterator>int main() {std::vector<int> vec = {1, 2,3, 4, 5};// 使用前向迭代器遍历向量for (std::forward_list<int>::iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

双向迭代器

双向迭代器不仅可以前进,还可以后退,适用于需要双向遍历序列的操作。

#include <list>
#include <iostream>int main() {std::list<int> myList = {1, 2, 3, 4, 5};// 使用双向迭代器遍历列表for (std::list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 反向遍历列表for (std::list<int>::reverse_iterator it = myList.rbegin(); it != myList.rend(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

随机访问迭代器

随机访问迭代器可以直接跳转到任意位置,适用于数组和向量等支持随机访问的容器。

#include <vector>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用随机访问迭代器访问向量元素for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 直接跳转到任意位置std::vector<int>::iterator it = vec.begin() + 2;std::cout << "Element at index 2: " << *it << std::endl;return 0;
}

4. STL 函数对象和谓词

STL 中的函数对象和谓词提供了灵活的函数调用方式。函数对象是行为类似函数的对象,谓词是返回布尔值的函数对象。

函数对象

函数对象是重载了 operator() 的类对象,可以像函数一样被调用。

#include <vector>
#include <algorithm>
#include <iostream>class MultiplyBy {
public:MultiplyBy(int factor) : factor(factor) {}int operator()(int x) const {return x * factor;}
private:int factor;
};int main() {std::vector<int> vec = {1, 2, 3, 4, 5};std::vector<int> result(vec.size());// 使用函数对象进行元素变换std::transform(vec.begin(), vec.end(), result.begin(), MultiplyBy(2));std::cout << "Transformed vector: ";for (int elem : result) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

谓词

谓词是返回布尔值的函数对象,分为一元谓词和二元谓词。

#include <vector>
#include <algorithm>
#include <iostream>class IsEven {
public:bool operator()(int x) const {return x % 2 == 0;}
};class IsGreater {
public:IsGreater(int value) : value(value) {}bool operator()(int x) const {return x > value;}
private:int value;
};int main() {std::vector<int> vec = {1, 2, 3, 4, 5, 6};// 使用一元谓词auto it = std::find_if(vec.begin(), vec.end(), IsEven());if (it != vec.end()) {std::cout << "First even number: " << *it << std::endl;} else {std::cout << "No even numbers found" << std::endl;}// 使用二元谓词it = std::find_if(vec.begin(), vec.end(), IsGreater(4));if (it != vec.end()) {std::cout << "First number greater than 4: " << *it << std::endl;} else {std::cout << "No numbers greater than 4 found" << std::endl;}return 0;
}

绑定器和函数适配器

STL 提供了绑定器和函数适配器,用于调整函数对象和谓词的行为。

#include <vector>
#include <algorithm>
#include <iostream>
#include <functional>int main() {std::vector<int> vec = {1, 2, 3, 4, 5, 6};// 使用 std::bindauto it = std::find_if(vec.begin(), vec.end(), std::bind(std::greater<int>(), std::placeholders::_1, 4));if (it != vec.end()) {std::cout << "First number greater than 4: " << *it << std::endl;} else {std::cout << "No numbers greater than 4 found" << std::endl;}return 0;
}

总结

本文详细探讨了C++中命名空间和标准模板库(STL)的重要概念及其实际应用:

在命名空间部分,我们学习了命名空间的基本作用,即解决全局名称冲突的问题,通过显式作用域解析运算符和using声明的方式来访问命名空间中的成员。讨论了使用using namespace带来的便利性和潜在的命名冲突问题,以及C++11引入的内联命名空间和匿名命名空间的用法和优势。

在STL部分,我们深入研究了各种STL容器的特性和适用场景,如动态数组vector、双端队列deque、双向链表list,以及基于红黑树的关联容器set和map。我们介绍了STL提供的丰富算法库,包括查找、排序、复制等非修改序列算法和修改序列算法,以及迭代器的不同类型和功能,如输入迭代器、输出迭代器和随机访问迭代器。

Tip:为了获得更深入的学习体验,请参考相关教程或书籍,了解C++语言的更多基本结构和基本语法。

在这里插入图片描述
每篇图片分享
图片来自inscode上的开源程序
濒危动物:马来熊

相关文章:

(七)[重制]C++命名空间与标准模板库(STL)

​ 引言 在专栏C教程的第六篇C中的结构体与联合体中&#xff0c;介绍了C中的结构体和联合体&#xff0c;包括它们的定义、初始化、内存布局和对齐&#xff0c;以及作为函数参数和返回值的应用。在专栏C教程的第七篇中&#xff0c;我们将深入了解C中的命名空间&#xff08;nam…...

Elasticsearch:Runtime fields - 运行时字段(一)

目录 使用运行时字段带来的好处 激励 折衷 映射运行时字段 定义运行时字段而不使用脚本 忽略运行时字段上的脚本错误 更新和删除运行时字段 在搜索请求中定义运行时字段 创建使用其他运行时字段的运行时字段 运行时字段&#xff08;runtime fields&#xff09;是在查询…...

03:C语言运算符

C语言运算符 1、常见运算符2、赋值运算符3、判断运算符4、与- - 1、常见运算符 数学运算符号。常见数学运算符号&#xff0c;跟数学中理解相同 加号 - 减号 * 乘号 / 除号&#xff0c;相除以后的商 % 取余符号&#xff0c;相除以后余数是几 ()括号括起来优先级最高&#xff0…...

JAVA每日作业day7.4

ok了家人们今天学习了Date类和simpleDateformat类&#xff0c;话不多说我们一起看看吧 一.Date类 类 java.util.Date 表示特定的瞬间 ( 日期和时间 ) &#xff0c;精确到毫秒。 1.2 Date类的构造方法 public Date(): 用来创建当前系统时间对应的日期对象。 public Date(long …...

WordPress网站违法关键词字过滤插件下载text-filter

插件下载地址&#xff1a;https://www.wpadmin.cn/2025.html 插件介绍 WordPress网站违法关键词字过滤插件text-filter由本站原创开发,支持中英文关键字自动替换成**号&#xff0c;可以通过自定义保存修改按钮增加“预设关键字”&#xff0c;也可以导入定义好的txt文本形式的关…...

ros1仿真导航机器人 navigation

仅为学习记录和一些自己的思考&#xff0c;不具有参考意义。 1navigation导航框架 2导航设置过程 &#xff08;1&#xff09;启动仿真环境 roslaunch why_simulation why_robocup.launch &#xff08;2&#xff09;启动move_base导航、amcl定位 roslaunch why_simulation nav…...

Python制作动态颜色变换:颜色渐变动效

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame颜色变换函数主循环 完整代码 引言 颜色渐变动画是一种视觉上非常吸引人的效果&#xff0c;常用于网页设计和图形应用中。在这篇博客中&#xff0c;我们将使用Python创建一个动态颜色变换的动画效果。通…...

Python 异步编程介绍与代码示例

Python 异步编程介绍与代码示例 一、异步编程概述 异步编程是一种编程范式&#xff0c;它旨在处理那些需要等待I/O操作完成或执行耗时任务的情况。在传统的同步编程中&#xff0c;代码会按照顺序逐行执行&#xff0c;直到遇到一个耗时操作&#xff0c;它会阻塞程序的执行直到…...

堆叠的作用

一、为什么要堆叠 传统的园区网络采用设备和链路冗余来保证高可靠性&#xff0c;但其链路利用率低、网络维护成本高&#xff0c;堆叠技术将多台交换机虚拟成一台交换机&#xff0c;达到简化网络部署和降低网络维护工作量的目的。 二、堆叠优势 1、提高可靠性 堆叠系统多台成…...

ubuntu 如何查看某一个网卡的ip地址

在Ubuntu中&#xff0c;你可以使用多种方法来查看某一个网卡的IP地址。以下是一些常用的方法&#xff1a; 使用ip命令&#xff1a; ip命令是现代Linux系统中用于显示和操作路由、网络设备、策略路由和隧道的工具。要查看所有网络接口的IP地址&#xff0c;你可以使用&#xff1a…...

跨界客户服务:拓展服务边界,创造更多价值

在当今这个日新月异的商业时代&#xff0c;跨界合作已不再是新鲜词汇&#xff0c;它如同一股强劲的东风&#xff0c;吹散了行业间的壁垒&#xff0c;为企业服务创新开辟了前所未有的广阔天地。特别是在客户服务领域&#xff0c;跨界合作正以前所未有的深度和广度&#xff0c;拓…...

linux驱动编程 - kfifo先进先出队列

简介&#xff1a; kfifo是Linux Kernel里面的一个 FIFO&#xff08;先进先出&#xff09;数据结构&#xff0c;它采用环形循环队列的数据结构来实现&#xff0c;提供一个无边界的字节流服务&#xff0c;并且使用并行无锁编程技术&#xff0c;即当它用于只有一个入队线程和一个出…...

JS 四舍五入使用整理

一、Number.toFixed() 把数字转换为字符串,结果的小数点后有指定位数的数字,重点返回的数据类型为字符串 toFixed() 方法将一个浮点数转换为指定小数位数的字符串表示,如果小数位数高于数字,则使用 0 来填充。 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。…...

上万组风电,光伏,用户负荷数据分享

上万组风电&#xff0c;光伏&#xff0c;用户负荷数据分享 可用于风光负荷预测等研究 获取链接&#x1f517; https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取码&#xff1a;381i 获取链接&#x1f517; https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取…...

在物联网快速发展的趋势下,Java 怎样优化对低功耗、资源受限的边缘设备的支持,保障物联网应用的稳定运行?

在物联网快速发展的趋势下&#xff0c;Java可以通过以下方式优化对低功耗、资源受限的边缘设备的支持&#xff0c;以保障物联网应用的稳定运行&#xff1a; 精简Java运行环境&#xff1a;针对边缘设备的资源限制&#xff0c;可以使用精简型的Java运行环境&#xff0c;避免不必要…...

java-HashSet 源码分析 1

## 深入分析 Java 中的 HashSet 源码 HashSet 是 Java 集合框架中的一个重要类&#xff0c;它基于哈希表实现&#xff0c;用于存储不重复的元素。HashSet 允许 null 元素&#xff0c;并且不保证元素的顺序。本文将详细分析 HashSet 的源码&#xff0c;包括其数据结构、构造方法…...

K8S 部署 EFK

安装说明 系统版本为 Centos7.9 内核版本为 6.3.5-1.el7 K8S版本为 v1.26.14 ES官网 开始安装 本次安装使用官方ECK方式部署 EFK&#xff0c;部署的是当前的最新版本。 在 Kubernetes 集群中部署 ECK 安装自定义资源 如果能打开这个网址的话直接用这个命令安装,打不开的话…...

AI Earth应用—— 在线使用sentinel数据VV和VH波段进行水体提取分析(昆明抚仙湖、滇池为例)

AI Earth 本文的主要目的就是对水体进行提取,这里,具体的操作步骤很简单基本上是通过,首页的数据检索,选择需要研究的区域,然后选择工具箱种的水体提取分析即可,剩下的就交给阿里云去处理,结果如下: 这是我所选取的一景影像: 详情 卫星: Sentinel-1 级别: 1 …...

基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建基于Hadoop的全分布式集群---任务9:HBase的安装和部署

任务描述 任务内容为HBase的安装部署与测试。 任务指导 HBase集群需要整个集群所有节点安装的HBase版本保持一致&#xff0c;并且拥有相同的配置 具体配置步骤如下&#xff1a; 1. 解压缩HBase的压缩包 2. 配置HBase的环境变量 3. 修改HBase的配置文件&#xff0c;HBase…...

go语言day09 通道 协程的死锁

Go语言学习——channel的死锁其实没那么复杂 - JackieZheng - 博客园 (cnblogs.com) 目录 通道 创建通道 1&#xff09;无缓冲通道 2&#xff09;有缓冲通道 通道的使用 1) 值从通道入口进 2) 值从通道出口出 信道死锁&#xff1a; 0&#xff09;死锁现场0 1&#xff09;死…...

黑马的ES课程中的不足

在我自己做项目使用ES的时候&#xff0c;发现了黑马没教的方法&#xff0c;以及一些它项目的小问题 搜索时的匹配方法 这个boolQuery().should 我的项目是通过文章的标题title和内容content来进行搜索 但是黑马它的项目只用了must 如果我们的title和content都用must&#x…...

STM32 中断编程入门

目录 一、中断系统 1、中断的原理 2、中断类型 外部中断 定时器中断 DMA中断 3、中断处理函数 中断标志位清除 中断服务程序退出 二、实际应用 中断控制LED 任务要求 代码示例 中断控制串口通信 任务要求1 代码示例 任务要求2 代码示例 总结 学习目标&…...

使用maven搭建一个SpingBoot项目

1.首先创建一个maven项目 注意选择合适的jdk版本 2.添加依赖 2.在pom.xml中至少添加依赖 spring-boot-starter-web 依赖&#xff0c;目的是引入Tomcat&#xff0c;以及SpringMVC等&#xff0c;使项目具有web功能。 <!-- 引入 包含tomcat&#xff0c;SpringMVC&#xff0c…...

使用 HTTPS 已成为网站的标配了

网站使用HTTPS的原因 背景&#xff1a;十年前&#xff0c;HTTPS并不普遍&#xff0c;但随着网络安全意识的提高&#xff0c;现在已成为网站标配。 网站升级到HTTPS的动机 安全问题&#xff1a;HTTP缺乏安全机制&#xff0c;易被窃取和篡改数据。例如&#xff0c;电信运营商劫…...

前后端分离Nginx

背景 旧的部署方式是将前端代码打包进后端包的resource server {listen 80;listen 443 ssl;server_name xxx.test.com;location / {proxy_pass http://xxx.test.com;} }后端&#xff1a;https:// xxx.test.com/simcard/querySimcard 前端&#xff1a;https:// x…...

【简单讲解下Tauri】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

mac上挂载linux目录

在 macOS 上挂载 CentOS 目录步骤&#xff1a; 在挂载前确保 macOS 和 CentOS 在同一个局域网内&#xff0c;并且可以相互访问。如果有网络配置问题&#xff0c;可能会导致挂载失败或连接被拒绝的错误。 要在 macOS 上将 CentOS 的 /disk2/go 目录通过 NFS 挂载到 /Users/zon…...

Linux系统的服务——以Centos7为例

一、Linux系统的服务简介 服务是向外部提供对应功能的进程&#xff0c;其运行在系统后台&#xff0c;能够7*24小时持续不断的提供外界随时发来的服务请求&#xff0c;且服务进程常驻在内存中&#xff0c;具有固定的端口号&#xff0c;通过端口号就能找到服务内容。 提供服务的一…...

Numpy矩阵运算

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Numpy概述 Numpy是Python的一个开源数值计算扩展库&#xff0c;主要用于存储和处理大型多维数组和矩阵&#xff0c;并且提供了大量的数学函数来操作这些数组。Numpy是Pytho…...

Spring容器Bean之XML配置方式

一、首先看applicationContext.xml里的配置项bean 我们采用xml配置文件的方式对bean进行声明和管理&#xff0c;每一个bean标签都代表着需要被创建的对象并通过property标签可以为该类注入其他依赖对象&#xff0c;通过这种方式Spring容器就可以成功知道我们需要创建那些bean实…...

【Rust入门】生成随机数

文章目录 前言随机数库rand添加rand库到我们的工程生成一个随机数示例代码 总结 前言 在编程中&#xff0c;生成随机数是一种常见的需求&#xff0c;无论是用于数据分析、游戏开发还是模拟实验。Rust提供了强大的库来帮助我们生成随机数。在这篇文章中&#xff0c;我们将通过一…...

普通Java工程如何在代码中引用docker-compose.yml中的environment值

文章目录 一、概述二、常规做法1. 数据库配置分离2. 代码引用配置3. 编写启动类4. 支持打包成可执行包5. 支持可执行包打包成docker镜像6. docker运行 三、存在问题分析四、改进措施1. 包含environment 变量的编排文件2. 修改读取配置文件方式3. 为什么可以这样做 五、运行效果…...

微观特征轮廓尺寸测量:光学3D轮廓仪、共焦显微镜与台阶仪的应用

随着科技进步&#xff0c;显微测量仪器以满足日益增长的微观尺寸测量需求而不断发展进步。多种高精度测量仪器被用于微观尺寸的测量&#xff0c;其中包括光学3D表面轮廓仪&#xff08;白光干涉仪&#xff09;、共聚焦显微镜和台阶仪。有效评估材料表面的微观结构和形貌&#xf…...

Rust开发环境搭建

Rust开发环境搭建 环境 rust: 1.79.0(2024-06-13)1. Rustup下载器在线安装 windows&#xff1a; https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe unix&#xff1a; curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh2. R…...

图文识别0难度上手~基于飞浆对pdf简易ocr并转txt

前言 本篇pdf适用windows对视觉识别0基础的的纯小白用户。大佬请绕道~~ 注意&#xff1a; 本项目pdf的ocr对于表格、画图文字&#xff0c;水印等干扰没做任何处理&#xff0c;因此希望各位使用该功能的pdf尽量不要含有这些干扰项&#xff0c;以免影响翻译效果。 流程 1.构建…...

FFmpeg常用命令手册

官方文档&#xff1a;ffmpeg Documentation 常规选项 -i input_url 输入文件或者输入流的路径 Main 选项 -f fmt (input/output) 强制指定输入或输出文件的格式&#xff0c; 常见的格式名称包括flv&#xff0c;mp4、hls、mpegts、avi、mov -c[:stream_specifier] codec (i…...

CTF入门知识点

CTF知识点 md5函数 <?php$a 123;echo md5($a,true); ?> 括号中true显示输出二进制 替换成false显示输出十六进制绕过 ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c&#xff0c;这个字符串前几位刚好是 or 6 而 Mysql 刚好又会把 …...

Leetcode 完美数

1.题目要求: 对于一个 正整数&#xff0c;如果它和除了它自身以外的所有 正因子 之和相等&#xff0c;我们称它为 「完美数」。给定一个 整数 n&#xff0c; 如果是完美数&#xff0c;返回 true&#xff1b;否则返回 false。示例 1&#xff1a;输入&#xff1a;num 28 输出&a…...

springboot中的定时任务编写

第1部分&#xff1a;引言 1.1 定时任务的重要性 在现代软件开发中&#xff0c;定时任务是应用程序自动化和运维效率的关键组成部分。无论是数据备份、系统健康检查、定期报告生成&#xff0c;还是用户活动触发的自动化流程&#xff0c;定时任务都扮演着不可或缺的角色。它们确…...

第100+14步 ChatGPT学习:R实现随机森林分类

基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言&#xff0c;不想学Python咯。 答曰&#xff1a;可&#xff01;用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了&#xff0c;就帮各位搬运一下吧。 二、R代码实现随机森林分类 &#xff…...

C#面 :ASP.Net Core中有哪些异常处理的方案?

在 ASP.NET Core中&#xff0c;有多种异常处理方案可供选择。以下是其中几种常见的异常处理方案&#xff1a; 中间件异常处理&#xff1a; ASP.NET Core提供了一个中间件来处理全局异常。通过在Startup类的Configure方法中添加UseExceptionHandler中间件&#xff0c;可以捕获…...

论文辅导 | 基于多尺度分解的LSTM⁃ARIMA锂电池寿命预测

辅导文章 模型描述 锂电池剩余使用寿命&#xff08;Remaining useful life&#xff0c;RUL&#xff09;预测是锂电池研究的一个重要方向&#xff0c;通过对RUL的准确预测&#xff0c;可以更好地管理和维护电池&#xff0c;延长电池使用寿命。为了能够准确预测锂电池的RUL&…...

开关阀(4):对于客户技术要求信息的识别

1.阀门部分 2.执行器 行程时间的一般标准 The stroking times are applicable to throttling control valves and should not exceed 2 seconds/inch of valve diameter 3.附件 4.定位器...

Python统计实战:时间序列分析之二阶曲线预测和三阶曲线预测

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能&#xff0c;从而更快地掌握解决问题所需的能力。 &#xff08;以下练习题来源于《统计学—基于Python》。请在Q群455547227下载原始数据。&#xff09; 练习题 下表是某只股票…...

Drools开源业务规则引擎(三)- 事件模型(Event Model)

文章目录 Drools开源业务规则引擎&#xff08;三&#xff09;- 事件模型&#xff08;Event Model&#xff09;1.org.kie.api.event2.RuleRuntimeEventManager3.RuleRuntimeEventListener接口说明示例规则文件规则执行日志输出 4.AgentaEventListener接口说明示例监听器实现类My…...

智慧校园行政办公升级,日程监控不可或缺

在智慧校园的行政办公场景下&#xff0c;日程监控功能扮演了一个核心协调者的角色&#xff0c;它细腻地编织起时间管理的网络&#xff0c;确保各项活动与任务在井然有序中高效推进。这一功能通过以下几个方面&#xff0c;展现了其在提升工作效率与团队协作方面的独特价值。 首先…...

RedHat运维-Linux SSH基础3-sshd守护进程

1. sshd这个守护进程提供了OpenSSH服务&#xff0c;请问可以通过编辑哪些配置文件&#xff0c;来配置这个服务呢&#xff1f;________________________ 2. sshd这个守护进程提供了OpenSSH服务&#xff0c;请问可以通过编辑哪些配置文件&#xff0c;来配置这个服务呢&#xff1f…...

医院产科信息化管理系统源码,智慧产科管理系统,涵盖了从孕妇到医院初次建档、历次产检、住院分娩、统计上报到产后42天全部医院服务的信息化管理。

医院产科信息化管理系统源码&#xff0c;智慧产科管理系统&#xff0c;产科专科电子病历系统 技术架构&#xff1a;前后端分离Java&#xff0c;Vue&#xff0c;ElementUIMySQL8.0.36 医院产科信息化管理系统&#xff0c;通过构建专科病例系统实现临床保健一体化&#xff0c;涵…...

Softmax作为分类任务中神经网络输出层的优劣分析

Softmax作为分类任务中神经网络输出层的优劣分析 在深度学习领域&#xff0c;Softmax函数作为分类任务中神经网络的输出层&#xff0c;被广泛应用并展现出强大的优势。然而&#xff0c;任何技术都有其两面性&#xff0c;Softmax函数也不例外。本文将从多个角度深入分析Softmax…...

404白色唯美动态页面源码

404白色唯美动态页面源码,源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 404白色唯美动态页面源码...