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

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

📜 个人主页:@一伦明悦-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中的算法分为几类,包括遍历算法、修改算法、排序算法、查找算法、数值算法等,每类算法都有其特定的应用场景和功能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Chat-TTS chat-tts-ui 实机部署上手测试!Ubuntu服务器实机 2070Super*2 8GB部署全流程

项目介绍 开源的项目&#xff0c;感谢各位大佬的贡献&#xff01; 官方介绍&#xff1a;一个简单的本地网页界面&#xff0c;使用ChatTTS将文字合成为语音&#xff0c;同时支持对外提供API接口。A simple native web interface that uses ChatTTS to synthesize text into spe…

物联网技术-第3章物联网感知技术-3.3传感技术

目录 1.1什么是传感器 1.1.1生活中的传感器 1.1.2人的五官与传感器 1.1.3传感器的定义 1.1.4传感器的组成 1.2传感器的特性 1.2.1传感器的静态特征 1、灵敏度&#xff08;静态灵敏度&#xff09; 2.精度 3.线性度&#xff08;非线性误差&#xff09; 4.最小检测量&a…

SSRF服务端请求伪造

SSRF服务端请求伪造 SSRF漏洞原理 ​ SSRF(Server-Side Request Forgery:服务器端请求伪造) 一种由攻击者构造形成由服务端发起请求的一个安全漏洞;一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。&#xff08;正是因为它是由服务端发起的&#xff0c;所…

大模型“诸神之战”,落地才是赛点

ChatGPT 诞生已经快一年&#xff0c;你还在与它对话吗&#xff1f; 有的人用来写报告、改代码&#xff0c;让它成为得力帮手&#xff1b;有的人却只是“调戏”个两三回&#xff0c;让它创作诗歌或故事&#xff0c;便不再“宠幸”。 根据网站分析工具 SimilarWeb 的数据&#…

护眼灯哪些牌子好?一文刨析护眼灯怎么选择!

护眼灯哪些牌子好&#xff1f;护眼台灯作为对抗视力挑战的一种方法&#xff0c;逐渐赢得了众多家长的青睐。这些台灯利用尖端光学技术&#xff0c;发出柔和且无刺激的照明&#xff0c;有助于保护眼睛不受伤害。它们不但可以调节亮度和色温&#xff0c;打造一个舒适且自然的阅读…

(done) 关于 GNU/Linux API setenv 的实验

写一个下面的代码来验证 #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h>int main() {// 设置环境变量 MY_VAR 的值为 "hello_world"if (setenv("MY_VAR", "hello_world", 1) ! 0…

将粘贴文本进输入框中时不带有任何格式(包括背景颜色和字体)解决办法

只需要四行代码解决&#xff0c;这里用到vue3里面的事件 paste"" 代码块&#xff1a; <div paste"handlePaste"></div>//粘贴文本时不带有任何格式&#xff08;包括背景颜色和字体&#xff09;function handlePaste(event) {event.preventDef…

Mac M3 Pro 部署Spark-2.3.2 On Hive-3.1.3

目录 1、下载安装包 2、解压安装 3、修改配置 4、将spark的jars上传到hdfs 5、mysql中创建hive库 6、hive初始化数据库 7、启动Spark 8、启动HIVE 9、检查是否成功 mac的配置如下 1、下载安装包 官网 Apache Projects Releases 在search中搜索hadoop、hive spark &…

Github Copilot 用账号登录,完美支持chat,不妨试试

Github Copilot 代码补全等功能&#xff0c;提高写代码的效率 获取地址&#xff1a;https://web.52shizhan.cn/activity/copilot 如果之前是激活器激活的&#xff0c;请到环境变量里删除相关的copilot配置。 ① 发你注册的github账号的邮箱或用户名给客服&#xff0c;客服邀…

产品Web3D交互展示有什么优势?如何快速制作?

智能互联网时代&#xff0c;传统的图片、文字、视频等产品展示方式&#xff0c;因为缺少互动性&#xff0c;很难引起用户的兴趣&#xff0c;已经逐渐失去了宣传优势。 Web3D交互展示技术的出现&#xff0c;让众多品牌和企业找到了新的方向&#xff0c;线上产品展示不在枯燥无趣…

红海云CEO孙伟获2024“新锐企业家”荣誉

近日&#xff0c;由羊城晚报报业集团联合广东软件行业协会主办的“2024广东软件风云榜”活动圆满落下帷幕&#xff0c;红海云CEO孙伟以新技术、新业态、新模式&#xff0c;带领企业取得创新发展&#xff0c;荣膺2024广东软件风云榜“新锐企业家”称号。 为把握广东省数字经济和…

C/S、B/S架构(详解)

一、CS、BS架构定义 CS架构&#xff08;Client-Server Architecture&#xff09;是一种分布式计算模型&#xff0c;其中客户端和服务器之间通过网络进行通信。在这种架构中&#xff0c;客户端负责向服务器发送请求&#xff0c;并接收服务器返回的响应。服务器则负责处理客户端的…

南充文化旅游职业学院领导一行莅临泰迪智能科技参观交流

6月18日&#xff0c;南充文化旅游职业学院旅游系副书记刘周、教务处教学运行与质量保障科科长及智慧旅游技术应用专业教研室主任李月娴、大数据技术专业负责人 龙群才、大数据技术专业专任教师 李昱洁莅临泰迪智能科技产教融合实训中心参观交流。泰迪智能科技董事长张良均、副总…

白酒:酒文化与艺术创作的结合

酒文化与艺术创作在历史长河中相互交融&#xff0c;共同发展。云仓酒庄的豪迈白酒作为中国的酒的品牌&#xff0c;以其与众不同的口感和品质&#xff0c;成为了艺术创作的重要灵感来源。 首先&#xff0c;豪迈白酒的酿造技艺本身就是一种与众不同的艺术。酿酒师傅们在传承古老技…

springmvc拦截器 和 异常拦截器

springmvc拦截器的配置使用&#xff1a; 自定义监听器实现HandlerInterceptor接口&#xff1a; 在springmvc的配置文件中引入自定义拦截器对象及拦截目标 拦截器的方法调用 自定义一个拦截器&#xff1a; Component public class LoginInterceptor implements HandlerIntercept…

上位机图像处理和嵌入式模块部署(h750 mcu和usb虚拟串口)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于mcu usb而言&#xff0c;大部分情况下&#xff0c;它和上位机之间的关系都是device的关系。一般usb&#xff0c;可以分成host和device。如果mc…

【调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新】

调试笔记-系列文章目录 调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新 文章目录 调试笔记-系列文章目录调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试目标 二、调…

Python10 python多线程

1.什么是python多线程 Python的多线程指的是在一个Python程序中同时运行多个线程&#xff0c;以达到并发执行多个任务的目的。线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;是进程中的实际运作单位。 在Python中&#xff0c;多线程的…

【Hudi】基础概念-数据写

目录 数据写写操作写流程(UPSERT)写流程(Insert)写流程(Insert Overwrite)Key生成策略删除策略 数据写 写操作 UPSERT&#xff1a;默认行为&#xff0c;数据先通过index打标&#xff0c;有一些启发式算法决定消息的组织以及优化文件的大小>CDC导入INSERT:跳过index,写入效…

(已解决) Github无法显示图像问题

Github无法显示图像的问题 问题描述初次尝试最终解决 问题描述 今天打开github&#xff0c;创建了一个仓库&#xff0c;想从本地把一些最近做的东西传上来(git add . > git commit -m “xxx” > git push)&#xff0c;结果发现东西是成功传上来了&#xff0c;但是图片没…