【C++提高编程-10】----C++ STL常用拷贝和替换算法

news2024/11/20 8:39:06

🎩 欢迎来到技术探索的奇幻世界👨‍💻

📜 个人主页:@一伦明悦-CSDN博客

✍🏻 作者简介: C++软件开发、Python机器学习爱好者

🗣️ 互动与支持💬评论      👍🏻点赞      📂收藏     👀关注+

如果文章有所帮助,欢迎留下您宝贵的评论,

点赞加收藏支持我,点击关注,一起进步!

前言

       STL(Standard Template Library)是C++标准库的一部分,提供了丰富的数据结构和算法,用于处理数据和实现常见的计算任务。STL中的算法分为几类,包括遍历算法、修改算法、排序算法、查找算法、数值算法等,每类算法都有其特定的应用场景和功能。

正文

01-拷贝和替换算法之copy用法

      在 C++ 的 STL(Standard Template Library)中,提供了一系列的算法来操作容器和序列。其中,拷贝和替换算法是常见的操作之一,它们能够方便地在容器或序列之间进行数据的复制或替换。本文将重点介绍 std::copy 算法的用法和示例。

1. std::copy 简介

std::copy 算法用于将一个序列的元素复制到另一个序列中。它的原型定义在 <algorithm> 头文件中,并且通常与迭代器一起使用,允许在不同容器类型之间或同一容器内不同位置之间进行数据的复制操作。

2. std::copy 函数签名

template< class InputIt, class OutputIt >
OutputIt copy( InputIt first, InputIt last, OutputIt d_first );
  • firstlast:定义了输入序列的起始和结束位置(包括起始,但不包括结束)。
  • d_first:定义了输出序列的起始位置,即从这里开始复制数据。

3. 参数说明

  • InputIt:表示输入序列的迭代器类型,通常是指向要复制的容器的迭代器。
  • OutputIt:表示输出序列的迭代器类型,通常是指向目标容器或输出位置的迭代器。

4. 使用示例

下面通过一个简单的示例来说明 std::copy 的具体用法。

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> source = {1, 2, 3, 4, 5};
    std::vector<int> destination(5);  // 目标容器,预先分配空间

    // 使用 std::copy 将 source 中的元素复制到 destination 中
    std::copy(source.begin(), source.end(), destination.begin());

    // 输出目标容器中的元素,验证复制结果
    for (int num : destination) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

5. 示例解释

  • 首先,我们定义了一个 source 容器,其中包含了整数 {1, 2, 3, 4, 5}
  • 然后,我们创建了 destination 容器,它的大小与 source 相同,并预先分配了足够的空间来存放复制后的数据。
  • 在 std::copy 调用中,我们传递了 source.begin() 和 source.end() 作为输入范围,并且传递了 destination.begin() 作为输出起始位置。这样,source 中的所有元素被复制到了 destination 中。
  • 最后,通过简单的循环输出,我们验证了 destination 中的元素确实与 source 中的元素相同。

6. 总结

使用 std::copy 算法能够方便地完成容器间的数据复制操作,它的灵活性和效率使得在实际编程中被广泛应用。理解其参数和用法能够帮助程序员更高效地处理数据复制任务,同时提升代码的可读性和维护性。

这段代码演示了如何使用 C++ STL 中的 <algorithm> 头文件中的 copy 函数和 for_each 算法,以及自定义函数对象来实现向量之间的元素复制和打印输出。

1. 包含头文件

#include <algorithm>
#include <vector>
#include <iostream>

这些是 C++ 标准库的头文件,分别包含了 copy 算法、vector 容器和输入输出流。

2. 自定义函数对象 myPrint

class myPrint
{
public:
    void operator()(int val)
    {
        std::cout << val << " ";
    }
};

myPrint 是一个函数对象类,重载了 operator(),用于输出传入的整数 val。在 for_each 算法中,会使用这个函数对象来打印容器中的元素。

3. test01 函数

void test01()
{
    std::vector<int> v1;
    for (int i = 0; i < 10; i++) {
        v1.push_back(i + 1);
    }
    
    std::vector<int> v2;
    v2.resize(v1.size());

    // 使用 std::copy 将 v1 中的元素复制到 v2 中
    std::copy(v1.begin(), v1.end(), v2.begin());

    // 使用 for_each 和自定义函数对象 myPrint 输出 v2 中的元素
    std::for_each(v2.begin(), v2.end(), myPrint());
    
    std::cout << std::endl;
}

详细解释:

  • 创建两个向量 v1 和 v2

    • v1 用于存储整数 1 到 10。
    • v2 先调整大小为 v1 的大小,以准备接收从 v1 复制的元素。
  • 使用 std::copy 复制元素

    • std::copy(v1.begin(), v1.end(), v2.begin()) 将 v1 中的元素复制到 v2 中。v1.begin() 和 v1.end() 分别是 v1 的起始和结束迭代器,v2.begin() 是 v2 的起始迭代器。
  • 使用 for_each 打印元素

    • std::for_each(v2.begin(), v2.end(), myPrint()) 对 v2 中的每个元素都调用 myPrint 函数对象的 operator(),从而将元素依次输出到标准输出流中。

4. main 函数

int main() {
    test01();
    system("pause");
    return 0;
}

main 函数调用 test01() 来执行示例代码,并在程序结束前调用 system("pause") 来暂停控制台,以便查看输出结果。

总结

这段代码展示了如何使用 std::copy 将一个向量 (v1) 的内容复制到另一个向量 (v2) 中,并使用 for_each 结合自定义函数对象来遍历 v2 并输出其内容。这种方式利用了 STL 提供的算法和函数对象的灵活性,使代码更加清晰和易于维护。

#include <algorithm>
#include <vector>
class myPrint
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};
void test01()
{
	vector<int> v1;
	for (int i = 0; i < 10; i++) {
		v1.push_back(i + 1);
	}
	vector<int> v2;
	v2.resize(v1.size());
	copy(v1.begin(), v1.end(), v2.begin());
	for_each(v2.begin(), v2.end(), myPrint());
	cout << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}

02-拷贝和替换算法之replace用法

      在 C++ 的 STL(Standard Template Library)中,除了拷贝(如 std::copy)之外,还提供了替换算法,其中 std::replace 是其中之一。这篇文章将详细介绍 std::replace 算法的用法和示例。

1. std::replace 简介

std::replace 算法用于在容器中将指定值的所有元素替换为另一个值。它的原型定义在 <algorithm> 头文件中,可以轻松地对容器中的元素进行替换操作。

2. std::replace 函数签名

template< class ForwardIt, class T >
void replace( ForwardIt first, ForwardIt last, const T& old_value, const T& new_value );
  • firstlast:定义了要替换的元素范围,从 first(包含)到 last(不包含)。
  • old_value:要被替换的值。
  • new_value:替换成的新值。

3. 参数说明

  • ForwardIt:表示前向迭代器类型,通常是指向容器的迭代器。
  • T:表示元素的类型,通常是容器中存储的元素类型。

4. 使用示例

下面通过一个简单的示例来说明 std::replace 的具体用法。

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 2, 5, 2};

    // 使用 std::replace 将 v 中的所有值为 2 的元素替换为 20
    std::replace(v.begin(), v.end(), 2, 20);

    // 输出替换后的向量内容
    for (int num : v) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

5. 示例解释

  • 首先,我们定义了一个 vector 容器 v,其中包含了整数 {1, 2, 3, 4, 2, 5, 2}
  • 然后,我们使用 std::replace 调用 std::replace(v.begin(), v.end(), 2, 20),将 v 中所有值为 2 的元素替换为 20。
  • 最后,通过简单的循环输出,我们验证了替换操作的结果,输出为 1 20 3 4 20 5 20

6. 总结

使用 std::replace 算法能够快速地替换容器中的特定值,提高了代码的可读性和简洁性。理解其参数和用法可以帮助程序员在实际编程中处理替换操作,尤其是在需要大量元素替换时尤为方便。

这段代码展示了如何使用 C++ STL 中的 replace 算法来替换容器中指定值的元素,并结合自定义函数对象 myPrint 打印容器中的元素。

1. 包含头文件

#include <algorithm>
#include <vector>
#include <iostream>

这些是 C++ 标准库的头文件,分别包含了 replace 算法、vector 容器和输入输出流。

2. 自定义函数对象 myPrint

class myPrint
{
public:
    void operator()(int val)
    {
        std::cout << val << " ";
    }
};

myPrint 是一个函数对象类,重载了 operator(),用于输出传入的整数 val。在 for_each 算法中,会使用这个函数对象来打印容器中的元素。

3. test01 函数

void test01()
{
    std::vector<int> v;
    v.push_back(20);
    v.push_back(30);
    v.push_back(20);
    v.push_back(40);
    v.push_back(50);
    v.push_back(10);
    v.push_back(20);

    std::cout << "替换前:" << std::endl;
    std::for_each(v.begin(), v.end(), myPrint());
    std::cout << std::endl;

    // 将容器中的20 替换成 2000
    std::cout << "替换后:" << std::endl;
    std::replace(v.begin(), v.end(), 20, 2000);
    std::for_each(v.begin(), v.end(), myPrint());
    std::cout << std::endl;
}

详细解释:

  • 创建向量 v

    • v 用于存储整数元素 {20, 30, 20, 40, 50, 10, 20}
  • 打印原始容器元素

    • std::for_each(v.begin(), v.end(), myPrint()) 使用自定义函数对象 myPrint 打印容器中的元素,即输出 “20 30 20 40 50 10 20”。
  • 使用 std::replace 进行替换

    • std::replace(v.begin(), v.end(), 20, 2000) 将容器中所有值为 20 的元素替换为 2000。
  • 打印替换后的容器元素

    • 再次使用 std::for_each(v.begin(), v.end(), myPrint()) 打印容器中的元素,此时输出为 “2000 30 2000 40 50 10 2000”,验证了替换操作的结果。

4. main 函数

int main() {
    test01();
    system("pause");
    return 0;
}

main 函数调用 test01() 来执行示例代码,并在程序结束前调用 system("pause") 来暂停控制台,以便查看输出结果。

总结

这段代码演示了如何使用 std::replace 算法将容器中指定值的元素替换为另一个值,并通过自定义函数对象结合 for_each 算法打印容器中的元素。这种方式利用了 STL 提供的算法和函数对象的灵活性,使得替换操作变得简洁而直观。

#include <algorithm>
#include <vector>
class myPrint
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};
void test01()
{
	vector<int> v;
	v.push_back(20);
	v.push_back(30);
	v.push_back(20);
	v.push_back(40);
	v.push_back(50);
	v.push_back(10);
	v.push_back(20);
	cout << "替换前:" << endl;
	for_each(v.begin(), v.end(), myPrint());
	cout << endl;
	//将容器中的20 替换成 2000
	cout << "替换后:" << endl;
	replace(v.begin(), v.end(), 20, 2000);
	for_each(v.begin(), v.end(), myPrint());
	cout << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}

03-拷贝和替换算法之replace_if用法

      在 C++ 的 STL(Standard Template Library)中,除了拷贝(如 std::copy)和替换(如 std::replace)之外,还提供了条件替换算法 std::replace_if。这篇文章将详细介绍 std::replace_if 算法的用法和示例。

1. std::replace_if 简介

std::replace_if 算法用于在容器中根据指定的条件替换元素。它的原型定义在 <algorithm> 头文件中,可以根据自定义的条件函数对容器中的元素进行替换操作。

2. std::replace_if 函数签名

template< class ForwardIt, class UnaryPredicate, class T >
void replace_if( ForwardIt first, ForwardIt last, UnaryPredicate p, const T& new_value );
  • firstlast:定义了要替换的元素范围,从 first(包含)到 last(不包含)。
  • p:用于判断要替换的元素的一元谓词(Unary Predicate)。
  • new_value:替换成的新值。

3. 参数说明

  • ForwardIt:表示前向迭代器类型,通常是指向容器的迭代器。
  • UnaryPredicate:表示一元谓词,接受一个参数并返回 bool 值的函数对象,用于判断要替换的元素是否符合条件。
  • T:表示元素的类型,通常是容器中存储的元素类型。

4. 使用示例

下面通过一个简单的示例来说明 std::replace_if 的具体用法。

#include <iostream>
#include <algorithm>
#include <vector>

bool isEven(int num) {
    return num % 2 == 0;
}

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    // 使用 std::replace_if 将 v 中所有偶数替换为 0
    std::replace_if(v.begin(), v.end(), isEven, 0);

    // 输出替换后的向量内容
    for (int num : v) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

5. 示例解释

  • 首先,我们定义了一个 vector 容器 v,其中包含了整数 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
  • 然后,我们使用 std::replace_if 调用 std::replace_if(v.begin(), v.end(), isEven, 0),将 v 中所有偶数替换为 0,其中 isEven 是一个用于判断是否为偶数的一元谓词。
  • 最后,通过简单的循环输出,我们验证了替换操作的结果,输出为 1 0 3 0 5 0 7 0 9 0

6. 总结

使用 std::replace_if 算法能够根据自定义条件函数对容器中的元素进行替换,进一步提高了算法的灵活性和可扩展性。理解其参数和用法可以帮助程序员在实际编程中处理更加复杂的替换操作,例如基于特定条件替换元素。

这段代码演示了如何使用 std::replace_if 算法来替换容器中符合特定条件的元素。下面我们逐步解释每个部分的功能和作用。

包含头文件和定义类

首先是头文件的包含和两个类的定义:

#include <algorithm>
#include <vector>
#include <iostream>

class myPrint
{
public:
    void operator()(int val)
    {
        std::cout << val << " ";
    }
};

class ReplaceGreater30
{
public:
    bool operator()(int val)
    {
        return val >= 30;
    }
};
  • 头文件包含

    • 包含了必要的头文件 <algorithm><vector> 和 <iostream>
  • 自定义类 myPrint

    • 这是一个函数对象类,重载了 operator(),用于打印传入的整数 val
  • 自定义类 ReplaceGreater30

    • 这是一个谓词类(Predicate),重载了 operator(),根据传入的整数 val 判断是否大于等于 30,并返回相应的布尔值。

函数 test01()

接下来是 test01() 函数的实现:

void test01()
{
    std::vector<int> v;
    v.push_back(20);
    v.push_back(30);
    v.push_back(20);
    v.push_back(40);
    v.push_back(50);
    v.push_back(10);
    v.push_back(20);

    std::cout << "替换前:" << std::endl;
    std::for_each(v.begin(), v.end(), myPrint());
    std::cout << std::endl;

    // 将容器中大于等于的30 替换成 3000
    std::cout << "替换后:" << std::endl;
    std::replace_if(v.begin(), v.end(), ReplaceGreater30(), 3000);
    std::for_each(v.begin(), v.end(), myPrint());
    std::cout << std::endl;
}

详细解释:

  • 创建向量 v

    • v 用于存储整数元素 {20, 30, 20, 40, 50, 10, 20}
  • 打印原始容器元素

    • 使用 std::for_each(v.begin(), v.end(), myPrint()) 打印容器中的元素,输出 “20 30 20 40 50 10 20”。
  • 使用 std::replace_if 进行替换

    • std::replace_if(v.begin(), v.end(), ReplaceGreater30(), 3000) 将容器中所有满足 ReplaceGreater30() 条件(即大于等于 30)的元素替换为 3000。
  • 打印替换后的容器元素

    • 再次使用 std::for_each(v.begin(), v.end(), myPrint()) 打印容器中的元素,输出为 “20 3000 20 3000 3000 10 20”,验证了替换操作的结果。

main 函数

最后是 main() 函数,用于调用 test01() 函数并暂停程序执行:

int main() {
    test01();
    system("pause");
    return 0;
}

总结

这段代码展示了如何利用 std::replace_if 算法根据自定义的条件谓词类 ReplaceGreater30,将容器中符合条件的元素替换为指定的值。这种方式能够灵活地处理复杂的替换逻辑,通过结合函数对象和算法,提升了代码的可读性和可维护性。

#include <algorithm>
#include <vector>
class myPrint
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};
class ReplaceGreater30
{
public:
	bool operator()(int val)
	{
		return val >= 30;
	}
};
void test01()
{
	vector<int> v;
	v.push_back(20);
	v.push_back(30);
	v.push_back(20);
	v.push_back(40);
	v.push_back(50);
	v.push_back(10);
	v.push_back(20);
	cout << "替换前:" << endl;
	for_each(v.begin(), v.end(), myPrint());
	cout << endl;
	//将容器中大于等于的30 替换成 3000
	cout << "替换后:" << endl;
	replace_if(v.begin(), v.end(), ReplaceGreater30(), 3000);
	for_each(v.begin(), v.end(), myPrint());
	cout << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}

04-拷贝和替换算法之swap用法

     

在 C++ 的 STL(Standard Template Library)中,除了拷贝(如 std::copy)和替换(如 std::replace 和 std::replace_if)之外,还有一个重要的算法 std::swap,用于交换两个元素的值。下面将详细介绍 std::swap 算法的用法和示例。

1. std::swap 简介

std::swap 算法用于交换两个元素的值。它的原型定义在 <algorithm> 头文件中,可以用于交换容器中的元素值。

2. std::swap 函数签名

template< class T >
void swap( T& a, T& b );
  • ab:要交换值的两个对象。

3. 参数说明

  • T:表示元素的类型。

4. 使用示例

下面通过一个简单的示例来说明 std::swap 的具体用法。

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};

    // 交换第一个和最后一个元素的值
    std::swap(v[0], v[v.size() - 1]);

    // 输出交换后的向量内容
    for (int num : v) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

5. 示例解释

  • 首先,我们定义了一个 vector 容器 v,其中包含了整数 {1, 2, 3, 4, 5}
  • 然后,我们使用 std::swap 将第一个元素和最后一个元素的值进行了交换,即将 v[0] 和 v[4] 的值交换。
  • 最后,通过简单的循环输出,我们验证了交换操作的结果,输出为 5 2 3 4 1

6. 总结

使用 std::swap 算法能够快速方便地交换两个元素的值,是 C++ 中常用的一个算法之一。它在容器操作中尤其有用,能够简化代码并提高效率。

这段代码演示了如何使用 std::swap 算法来交换两个容器的内容。下面逐步解释每个部分的功能和作用。

包含头文件和定义类

首先是头文件的包含和一个自定义的函数对象类:

#include <algorithm>
#include <vector>
#include <iostream>

class myPrint
{
public:
    void operator()(int val)
    {
        std::cout << val << " ";
    }
};
  • 头文件包含

    • 包含了必要的头文件 <algorithm><vector> 和 <iostream>
  • 自定义类 myPrint

    • 这是一个函数对象类,重载了 operator(),用于打印传入的整数 val

函数 test01()

接下来是 test01() 函数的实现:

void test01()
{
    std::vector<int> v1;
    std::vector<int> v2;
    for (int i = 0; i < 10; i++) {
        v1.push_back(i);
        v2.push_back(i + 100);
    }

    std::cout << "交换前: " << std::endl;
    std::for_each(v1.begin(), v1.end(), myPrint());
    std::cout << std::endl;
    std::for_each(v2.begin(), v2.end(), myPrint());
    std::cout << std::endl;

    std::cout << "交换后: " << std::endl;
    std::swap(v1, v2);

    std::for_each(v1.begin(), v1.end(), myPrint());
    std::cout << std::endl;
    std::for_each(v2.begin(), v2.end(), myPrint());
    std::cout << std::endl;
}

详细解释:

  • 创建两个向量 v1 和 v2

    • v1 包含了整数 {0, 1, 2, ..., 9}
    • v2 包含了整数 {100, 101, 102, ..., 109},即每个元素比 v1 中对应位置的元素大 100。
  • 打印交换前的两个容器元素

    • 分别使用 std::for_each 打印 v1 和 v2 的元素,验证初始化结果。
  • 使用 std::swap 进行容器交换

    • std::swap(v1, v2) 将 v1 和 v2 的内容进行交换。
  • 打印交换后的两个容器元素

    • 再次使用 std::for_each 打印交换后的 v1 和 v2 的元素,验证交换操作的正确性。

main 函数

最后是 main() 函数,用于调用 test01() 函数并暂停程序执行:

int main() {
    test01();
    system("pause");
    return 0;
}

总结

这段代码展示了如何使用 std::swap 算法来交换两个容器的内容。通过 std::swap(v1, v2),可以快速高效地交换两个容器,而不需要手动遍历和交换每个元素,提高了代码的简洁性和可读性。

#include <algorithm>
#include <vector>
class myPrint
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};
void test01()
{
	vector<int> v1;
	vector<int> v2;
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
		v2.push_back(i + 100);
	}
	cout << "交换前: " << endl;
	for_each(v1.begin(), v1.end(), myPrint());
	cout << endl;
	for_each(v2.begin(), v2.end(), myPrint());
	cout << endl;
	cout << "交换后: " << endl;
	swap(v1, v2);
	for_each(v1.begin(), v1.end(), myPrint());
	cout << endl;
	for_each(v2.begin(), v2.end(), myPrint());
	cout << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}

总结

       STL(Standard Template Library)是C++标准库的一部分,提供了丰富的数据结构和算法,用于处理数据和实现常见的计算任务。STL中的算法分为几类,包括遍历算法、修改算法、排序算法、查找算法、数值算法等,每类算法都有其特定的应用场景和功能。

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

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

相关文章

Intelij IDEA中Mapper.xml无法构建到资源目录的问题

问题场景&#xff1a; 在尝试把原本在eclipse上的Java Web项目转移至Intelij idea上时&#xff0c;在配置文件均与eclipse一致的情况下出现了如下报错&#xff1a; org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.umbrella.crm_core.…

Ubuntu网络管理命令:route

安装Ubuntu桌面系统&#xff08;虚拟机&#xff09;_虚拟机安装ubuntu桌面版-CSDN博客 route命令与ifconfig命令都在net-tools软件包中&#xff0c;是一个传统的Linux路由管理命令。通过route命令可以显示和管理路由表。route命令的基本语法如下&#xff1a; route [options]…

尚硅谷爬虫学习第一天(3) 请求对象定制

#url的组成 #协议 http&#xff0c;https&#xff0c;一个安全&#xff0c;一个不安全。 #主机&#xff0c; 端口号 学过java 的肯定知道 沃日&#xff0c;以前面试运维的时候&#xff0c;问到主机地址&#xff0c;我懵逼了下&#xff0c;回了个8080 # 主机地址 80 # …

[Redis]持久化机制

众所周知&#xff0c;Redis是内存数据库&#xff0c;也就是把数据存在内存上&#xff0c;读写速度很快&#xff0c;但是&#xff0c;内存的数据容易丢失&#xff0c;为了数据的持久性&#xff0c;还得把数据存储到硬盘上 也就是说&#xff0c;内存有一份数据&#xff0c;硬盘也…

python是TIOBE编程语言排名第一的编程语言,它有什么优点?它的使用场景有哪些?用python打印数字1--100,用python打印九九乘法表怎么写?

Python是TIOBE编程语言排行榜排名第一的编程语言 。 python是一种解释性、交互式、面向对象的跨平台的语言。 python设计者及名称由来 Guido van Rossum 荷兰人---吉多范罗苏姆&#xff0c;是 Python 编程语言的最初设计者&#xff0c;在 Python 社区一直担当终身仁慈独裁者&…

【权威出版/投稿优惠】2024年水利水电与能源环境科学国际会议(WRHEES 2024)

2024 International Conference on Water Resources, Hydropower, Energy and Environmental Science 2024年水利水电与能源环境科学国际会议 【会议信息】 会议简称&#xff1a;WRHEES 2024 大会时间&#xff1a;点击查看 截稿时间&#xff1a;点击查看 大会地点&#xff1a;…

聊一聊大模型应用落地那些事

大模型并不神奇 很多人听到"大模型"这个词可能会觉得很神秘&#xff0c;其实&#xff0c;LLM 就是神经网络&#xff0c;只是很大的神经网络&#xff0c;相对传统神经网络&#xff0c;大就是它的特点。我们用一个压缩算法的简单例子来帮助理解这个巨大的神经网络。 …

.[nicetomeetyou@onionmail.org].faust深入剖析勒索病毒及防范策略

引言&#xff1a; 在数字化时代&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒无疑是近年来网络安全的重大威胁之一。勒索病毒以其独特的加密机制和恶意勒索行为&#xff0c;给个人和企业带来了巨大的经济损失和数据安全风险。本文将从勒索病毒的传播方式、攻击链、…

.net 6 api 修改URL为小写

我们创建的api项目&#xff0c;url是[Route(“[controller]”)]&#xff0c;类似这样子定义的。我们的controller命名是大写字母开头的&#xff0c;显示在url很明显不是很好看&#xff08;url不区分大小写&#xff09;。转换方式&#xff1a; var builder WebApplication.Crea…

SpringBoot整合阿里云短信服务

文章目录 1. 准备工作2. 添加依赖3. 配置阿里云短信服务4. 创建配置类5. 创建服务类6.自定义异常7.使用服务类发送短信8.测试短信 1. 准备工作 注册阿里云账号&#xff1a;首先确保你有一个阿里云账号&#xff0c;并且已经开通了短信服务。获取AccessKey ID和AccessKey Secret…

奇怪的缓存一致性问题

天猫国际用户Push中心承接了国际用户触达相关的需求&#xff0c;比如短信、端内消息投放等等&#xff0c;并存在较高的并发场景。 该系统此前发现了一个查询投放计划plan为null的异常情况&#xff0c;在初期排查时有些丈二和尚摸不着头脑&#xff0c;后面突然灵光乍现——原来是…

探索线性回归模型

目录 一 线性回归的理论基础 什么是线性回归? 线性回归的假设 最小二乘法 二 线性回归的数学推导 线性回归参数的推导 多元线性回归 三 线性回归的模型构建 数据准备 训练模型 模型评估 四 线性回归的代码实现 基本实现 多元线性回归 五 线性回归的应用场景 预…

pygame游戏开发

Pygame游戏开发 pygame简介 模块库请参考&#xff1a;pygame官方文档 pygame可以用作游戏开发&#xff0c;但在商业游戏中真正的开发工具却不是pygame。使用pygame开发游戏周期长。 安装pygame 在pycharm中安装第三方库pygame&#xff1a; 在计算机中安装pygame&#xf…

C# OCCT Winform 界面搭建

目录 1.创建一个WInform项目 2.代码总览 代码解析 3.添加模型到场景 4.鼠标交互 1.创建一个WInform项目 2.代码总览 using Macad.Occt.Helper; using Macad.Occt; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Remoting.Co…

机器学习课程复习——支持向量机

支持向量机是一种二类分类模型。基本模型:定义在特征空间上的间隔最大的线性分类器模型升级:线性分类器+核技巧=非线性分类器学习策略:间隔最大化(可形式化为求解凸二次规划的问题;可等价于正则化的合页损失函数的最小化问题)学习算法:求解图二次规划的最优化算法支持向…

什么是Linux挂载

首先先说一下在Linux中一切皆文件&#xff08;硬件设备也是文件&#xff09;&#xff0c;所有文件都是存放在以根目录为树形目录结构中&#xff1b;下面来说说一下什么是挂载 挂载&#xff1a;指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录&#xff08;最好是…

架构师篇-1、总体架构设计

业务架构哲学本质 定位&#xff1a;赋予业务架构设计能力&#xff0c;具备业务架构设计思维模型&#xff0c;掌握业务架构哲学本质&#xff0c;形成以不变应万变的业务架构设计能力。 架构师所需要的能力&#xff1a; 带领业务成功通过框架思维赋能业务架构师知识体系构建掌…

如何卸载windows系统自带游戏

为了清晰地指导如何卸载Windows系统自带游戏&#xff0c;我们可以参考以下步骤进行&#xff1a; 方法一&#xff1a;通过控制面板卸载 打开控制面板进入程序和功能在控制面板中&#xff0c;找到并点击“程序和功能”。在程序列表中&#xff0c;找到你想要卸载的自带游戏。 方…

反激开关电源压敏电阻选型及计算

作用:在浪涌时间里面吸收一个很高的浪涌电压 压敏电阻对电压敏感&#xff0c;有变阻电压阈值 在电压阈值以下&#xff0c;表现出阻抗很大&#xff0c;超过电压阈值&#xff0c;表现出阻抗很小 压敏的选型及计算 压敏电阻的作用是抑制来自电源在异常时的尖峰电压和瞬态过电压&a…

C++编程入门,五个学习阶段让你变成高手

C是一门非常复杂而强大的编程语言&#xff0c;涵盖了广泛的知识领域&#xff0c;从语法基础到高级特性&#xff0c;再到网络通信和数据库操作&#xff0c;都需要逐步掌握。如果你是一个编程新手&#xff0c;尤其是对C感兴趣的新手&#xff0c;可能会发现这门语言的学习曲线有些…