C++进阶-STL 常用算法列举

STL 常用算法列举

  • 概述
    • 常用遍历算法
      • `for_each` 遍历容器
      • `transfrom` 搬运容器到另一个容器中
    • 常用查找函数
      • `find` 查找元素
      • `find_if` 按条件查找元素
      • `adjacent_find` 查找相邻重复元素
      • `binary_search` 二分查找法
      • `count` 统计元素个数
      • `count_if` 按条件统计元素个数
    • 常用排序算法
      • `sort` 对元素内内容进行排序
      • `random_shuffle` 洗牌 指定范围内的元素随机调整次序
      • `merge` 容器元素合并,并存储到另一个容器中
      • `reverse` 反转指定范围的元素
    • 常用拷贝和替换算法
      • `copy` 容器内指定范围的元素拷贝到另一个容器中
      • `replace` 将容器内指定范围的旧元素修改为新元素
      • `replace_if` 容器内指定范围满足条件的元素替换为新元素
      • `swap` 互换两个容器中的元素
    • 常用算数生成算法
      • `accumulate` 计算容器元素累计总和
      • `fill` 向容器中填充元素
    • 常用集合算法
      • `set_intersection` 求两个容器的交集
      • `set_union` 求两个容器的并集
      • `set_difference` 求两个容器的差集

概述

  • 算法主要是由头文件 <algorithm> <functional> <numeric> 组成
  • <algorithm>是所有STL头文件最大的一个,范围涉及到比较、交换、查找、遍历操作、复制、修改等
  • <numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数
  • <functional>定义了一些模板类,用以声明函数对象

常用遍历算法

for_each 遍历容器

  • 函数原型
    for_each(iterator beg, iterator end, _func);
    • 遍历算法,实现遍历容器元素
    • beg开始迭代器
    • end结束迭代器
    • _func函数或者函数对象
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void print(int val)
{
	std::cout << val << " ";
}

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

int main()
{
	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	for_each(v.begin(), v.end(), print);
	std::cout << std::endl;
	for_each(v.begin(), v.end(), Print());
}

运行结果

transfrom 搬运容器到另一个容器中

  • 功能描述: 搬运容器到另一个容器中
  • 函数原型:
    transfrom(iterator beg1, iterator end1, iterator beg2, _func);
    • beg1 源容器开始迭代器
    • end1 源容器结束迭代器
    • beg2 目标容器开始迭代器
    • _func 函数或者函数对象
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Transfrom
{
public:
	int operator()(int val)
	{
		return val * 3;
	}
};

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

int main()
{
	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	std::cout << "调用transform前的原verctor:" << std::endl;
	for_each(v.begin(), v.end(), Print());
	std::cout << std::endl;

	vector<int> v2;
	v2.resize(v.size());
	transform(v.begin(), v.end(), v2.begin(), Transfrom());
	std::cout << "调用transform后的原verctor2:" << std::endl;
	for_each(v2.begin(), v2.end(), Print());
	std::cout << std::endl;
}

执行结果

常用查找函数

find 查找元素

  • 功能描述: 查找指定的元素,返回找到指定元素的迭代器,找不到返回结束迭代器 end()
  • 函数原型:
    find(iterator beg, iterator end, value);
    • 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
    • beg 开始迭代器
    • end 结束迭代器
    • value 查找的元素

案例一:查找内置数据类型

vector<int> vt;
for (int i = 0; i < 10; i++)
{
	vt.push_back(i);
}
vector<int>::iterator it = find(vt.begin(), vt.end(), 3);
if (it == vt.end())
{
	std::cout << "not find!" << std::endl;
}
else
{
	std::cout << "find result" << std::endl;
}

案例二:查找自定义数据类型

class Demo
{
public:
	string name;
public:
	Demo(string name)
	{
		this->name = name;
	}
	bool operator== (const Demo& d1)
	{
		return this->name == d1.name;
	}
};

void findCustomDemo()
{
	vector<Demo> vt;
	for (int i = 0; i < 10; i++)
	{
		Demo demo(i+"");
		vt.push_back(demo);
	}
	Demo demo2(1 + "");
	vector<Demo>::iterator it = find(vt.begin(), vt.end(), demo2);
	if (it == vt.end())
	{
		std::cout << "not find!" << std::endl;
	}
	else
	{
		std::cout << "find result" << std::endl;
	}
}

查找自定义数据类型需要重载操作符 ==

find_if 按条件查找元素

  • 功能描述:按照条件查找元素
  • 函数原型:
    find_if(iterator beg, iterator end, _Pred);
    • 按照值查找元素,找到返回指定位置迭代器,找不到返回迭代器结束位置
    • beg: 开始迭代器
    • end: 结束迭代器
    • _Pred函数或者谓词(返回bool类型的仿函数)

案例一:查找内置数据类型

class FindFive
{
public:
	bool operator()(int val)
	{
		return val == 5;
	}
};

void findDemo()
{
	vector<int> vt;
	for (int i = 0; i < 10; i++)
	{
		vt.push_back(i);
	}
	vector<int>::iterator it = find_if(vt.begin(), vt.end(), FindFive());
	if (it == vt.end())
	{
		std::cout << "not find!" << std::endl;
	}
	else
	{
		std::cout << "find result" << std::endl;
	}
}

案例二:查找自定义数据类型

class Demo
{
public:
	string name;
public:
	Demo(string name)
	{
		this->name = name;
	}
};

class Find
{
public:
	bool operator()(Demo d)
	{
		return d.name == "1";
	}
};


void findCustomDemo()
{
	vector<Demo> vt;
	for (int i = 0; i < 10; i++)
	{
		Demo demo(i+"");
		vt.push_back(demo);
	}
	Demo demo2(1 + "");
	vector<Demo>::iterator it = find_if(vt.begin(), vt.end(), Find());
	if (it == vt.end())
	{
		std::cout << "not find!" << std::endl;
	}
	else
	{
		std::cout << "find result" << std::endl;
	}
}

adjacent_find 查找相邻重复元素

  • 功能描述:查找相邻重复元素
  • 函数原型:
    iterator adjacent_find(iterator beg, iterator end);
    • 查找相邻重复元素,返回相邻元素的第一个位置的迭代器
    • beg 开始迭代器
    • end 结束迭代器
int main()
{
	vector<int> vt;
	vt.push_back(1);
	vt.push_back(2);
	vt.push_back(3);
	vt.push_back(3);
	vt.push_back(1);
	vt.push_back(5);
	vector<int>::iterator it = adjacent_find(vt.begin(), vt.end());
	if (it == vt.end())
	{
		std::cout << "未找到相邻重复元素" << std::endl;
	}
	else
	{
		std::cout << "找到了相邻重复元素" << std::endl;
		for (; it != vt.end(); it++)
		{
			std::cout << *it << " ";
		}
		std::cout << std::endl;
	}
}

binary_search 二分查找法

  • 功能描述:查找指定元素是否存在
  • 函数原型:
    bool binary_search(iterator beg, iterator end, value);
    • 查找指定的元素,查找到返回true,否则false
    • 注意:在无序序列中不可用
    • beg: 开始迭代器
    • end: 结束迭代器
    • value: 查找的元素
int main()
{
	vector<int> vt;
	vt.push_back(1);
	vt.push_back(2);
	vt.push_back(3);
	vt.push_back(4);
	vt.push_back(5);
	vt.push_back(6);
	bool isFind = binary_search(vt.begin(), vt.end(), 3);
	if (!isFind)
	{
		std::cout << "未找到指定元素" << std::endl;
	}
	else
	{
		std::cout << "找到了指定元素" << std::endl;
	}
}

查找元素无序可能会查找不到值信息

count 统计元素个数

  • 功能描述:统计元素个数
  • 函数原型:
    count(iterator beg, iterator end, value);
    • 统计元素出现次数
    • beg 开始迭代器
    • end 结束迭代器
    • value 统计的元素
int main()
{
	vector<int> vt;
	vt.push_back(1);
	vt.push_back(2);
	vt.push_back(3);
	vt.push_back(4);
	vt.push_back(5);
	vt.push_back(3);
	int num_count = count(vt.begin(), vt.end(), 3);
	std::cout << "元素3共有 " << num_count << " 个" << std::endl;
}

count_if 按条件统计元素个数

  • 功能描述:统计元素个数
  • 函数原型:
    count_if(iterator beg, iterator end, _Pred);
    • 按条件统计元素出现次数
    • beg 开始迭代器
    • end 结束迭代器
    • Pred 谓词
class CountFive
{
public:
	bool operator()(int val)
	{
		return val == 5;
	}
};

int main()
{
	vector<int> vt;
	vt.push_back(1);
	vt.push_back(2);
	vt.push_back(3);
	vt.push_back(4);
	vt.push_back(5);
	vt.push_back(3);
	int num_count = count_if(vt.begin(), vt.end(), CountFive());
	std::cout << "元素5共有 " << num_count << " 个" << std::endl;
}

常用排序算法

sort 对元素内内容进行排序

  • 功能描述:对元素内内容进行排序
  • 函数原型:
    sort(iterator beg, iterator end, _Pred);
    • beg 开始迭代器
    • end 结束迭代器
    • _Pred 谓词
void print(const vector<int>& vt)
{
	for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
	{
		std::cout << *it << " ";
	}
	std::cout << std::endl;
}

int main()
{
	srand((unsigned int)time(NULL));
	vector<int> vt;
	for (int i = 0; i < 10; i++)
	{
		vt.push_back(rand() % 60 + 40);
	}
	std::cout << "排序前:" << std::endl;
	print(vt);
	sort(vt.begin(), vt.end());
	std::cout << "排序后:" << std::endl;
	print(vt);
	sort(vt.begin(), vt.end(), greater<>());
	std::cout << "降序排序后:" << std::endl;
	print(vt);
}

random_shuffle 洗牌 指定范围内的元素随机调整次序

  • 功能描述:洗牌 指定范围内的元素随机调整次序
  • 函数原型:
    random_shuffle(iterator beg, iterator end);
    • 指定范围内元素随机调整次序
    • beg 开始迭代器
    • end 结束迭代器
void print(const vector<int>& vt)
{
	for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
	{
		std::cout << *it << " ";
	}
	std::cout << std::endl;
}

int main()
{
	vector<int> vt;
	for (int i = 0; i < 10; i++)
	{
		vt.push_back(i);
	}
	std::cout << "排序前:" << std::endl;
	print(vt);
	random_shuffle(vt.begin(), vt.end());
	std::cout << "打乱顺序后:" << std::endl;
	print(vt);
}

为了让每次打乱的顺序更加的真实,需要加入随机数种子:
srand((unsigned int)time(NULL));

merge 容器元素合并,并存储到另一个容器中

  • 功能描述:容器元素合并,并存储到另一个容器中
  • 函数原型:
    merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
    • 容器元素合并,并存储到另一个容器中
    • 注意:两个容器必须是有序的
    • beg1 容器1开始迭代器
    • end1 容器1结束迭代器
    • beg2 容器2开始迭代器
    • end2 容器2结束迭代器
    • dest 目标容器开始迭代器
void print(const vector<int>& vt)
{
	for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
	{
		std::cout << *it << " ";
	}
	std::cout << std::endl;
}

int main()
{
	srand((unsigned int)time(NULL));
	vector<int> vt;
	vector<int> vt2;
	for (int i = 0; i < 10; i++)
	{
		vt.push_back(rand() % 60 + 40);
		vt2.push_back(rand() % 60 + 40);
	}
	sort(vt.begin(), vt.end());
	sort(vt2.begin(), vt2.end());
	std::cout << "合并前:" << std::endl;
	print(vt);
	print(vt2);
	vector<int> vt3;
	vt3.resize(vt.size() + vt2.size());
	merge(vt.begin(), vt.end(), vt2.begin(), vt2.end(), vt3.begin());
	std::cout << "合并后:" << std::endl;
	print(vt3);
}

执行结果

reverse 反转指定范围的元素

  • 功能描述:反转指定范围的元素
  • 函数原型:
    reverse(iterator beg, iterator end);
    • 反转指定范围的元素
    • beg 开始迭代器
    • end 结束迭代器
void print(const vector<int>& vt)
{
	for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
	{
		std::cout << *it << " ";
	}
	std::cout << std::endl;
}

int main()
{
	srand((unsigned int)time(NULL));
	vector<int> vt;
	for (int i = 0; i < 10; i++)
	{
		vt.push_back(rand() % 60 + 40);
	}
	sort(vt.begin(), vt.end());
	std::cout << "反转前:" << std::endl;
	print(vt);
	reverse(vt.begin(), vt.end());
	std::cout << "反转后:" << std::endl;
	print(vt);
}

运行结果

常用拷贝和替换算法

copy 容器内指定范围的元素拷贝到另一个容器中

  • 功能描述:容器内指定范围的元素拷贝到另一个容器中
  • 函数原型:
    copy(iterator beg, iterator end, iterator dest);
    • beg 开始迭代器
    • end 结束迭代器
    • dest 目标起始迭代器
void print(const vector<int>& vt)
{
	for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
	{
		std::cout << *it << " ";
	}
	std::cout << std::endl;
}

int main()
{
	srand((unsigned int)time(NULL));
	vector<int> vt;
	for (int i = 0; i < 10; i++)
	{
		vt.push_back(rand() % 60 + 40);
	}
	sort(vt.begin(), vt.end());
	std::cout << "copy前:" << std::endl;
	print(vt);
	vector<int> vt2;
	vt2.resize(vt.size());
	copy(vt.begin(), vt.end(), vt2.begin());
	std::cout << "copy后:" << std::endl;
	print(vt2);
}

replace 将容器内指定范围的旧元素修改为新元素

  • 功能描述:将容器内指定范围的旧元素修改为新元素
  • 函数原型:
    replace(iterator beg, iterator end, oldvalue, newvalue);
    • 将区间内就元素替换成新元素
    • beg 开始迭代器
    • end 结束迭代器
    • oldvalue 旧元素
    • newvalue 新元素
void print(const vector<int>& vt)
{
	for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
	{
		std::cout << *it << " ";
	}
	std::cout << std::endl;
}

int main()
{
	vector<int> vt;
	for (int i = 0; i < 10; i++)
	{
		vt.push_back(i);
	}
	sort(vt.begin(), vt.end());
	std::cout << "替换元素前:" << std::endl;
	print(vt);
	//3替换为10
	replace(vt.begin(), vt.end(), 3, 10);
	std::cout << "替换元素后:" << std::endl;
	print(vt);
}

执行结果

replace_if 容器内指定范围满足条件的元素替换为新元素

  • 功能描述:容器内指定范围满足条件的元素替换为新元素
  • 函数原型:
    replace_if(iterator beg, iterator end, _Pred, newvalue);
    • 按条件替换元素,满足条件的替换成指定元素
    • beg 开始迭代器
    • end 结束迭代器
    • _Pred 谓词
    • newvalue 替换的新元素
void print(const vector<int>& vt)
{
	for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
	{
		std::cout << *it << " ";
	}
	std::cout << std::endl;
}

class LessEqual3
{
public:
	bool operator()(int val)
	{
		return val <= 3;
	}
};

int main()
{
	vector<int> vt;
	for (int i = 0; i < 10; i++)
	{
		vt.push_back(i);
	}
	sort(vt.begin(), vt.end());
	std::cout << "替换元素前:" << std::endl;
	print(vt);
	//小于等于3的元素替换为10
	replace_if(vt.begin(), vt.end(), LessEqual3(), 10);
	std::cout << "替换元素后:" << std::endl;
	print(vt);
}

执行结果

swap 互换两个容器中的元素

  • 功能描述:互换两个容器中的元素
  • 函数原型:
    swap(container c1, container c2);
    • 互换两个容器的元素
    • c1 容器1
    • c2 容器2
void print(const vector<int>& vt)
{
	for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
	{
		std::cout << *it << " ";
	}
	std::cout << std::endl;
}

int main()
{
	vector<int> vt;
	vector<int> vt2;
	for (int i = 0; i < 10; i++)
	{
		vt.push_back(i);
		vt2.push_back(10 + i);
	}
	sort(vt.begin(), vt.end());
	std::cout << "交换容器元素前:" << std::endl;
	print(vt);
	print(vt2);
	swap(vt, vt2);
	std::cout << "交换容器元素后:" << std::endl;
	print(vt);
	print(vt2);
}

执行结果
两个交换的容器必须要同一种类型

常用算数生成算法

算数生成算法属于小型算法,使用时包含的头文件 #include <numeric>

accumulate 计算容器元素累计总和

  • 功能描述:计算容器元素累计总和
  • 函数原型:
    accumulate(iterator beg, iterator end, value);
    • 计算容器的元素总和
    • beg 开始迭代器
    • end 结束迭代器
    • value 起始值
void print(const vector<int>& vt)
{
	for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
	{
		std::cout << *it << " ";
	}
	std::cout << std::endl;
}

int main()
{
	vector<int> vt;
	for (int i = 0; i < 10; i++)
	{
		vt.push_back(i);
	}
	std::cout << "容器所有值信息:" << std::endl;
	print(vt);
	std::cout << "容器所有值之和等于:" << accumulate(vt.begin(), vt.end(), 0) << std::endl;
}

运行结果

fill 向容器中填充元素

  • 功能描述:向容器中填充元素
  • 函数原型:
    fill(iterator beg, iterator end, value);
    • 向容器中填充元素
    • beg 开始迭代器
    • end 结束迭代器
    • value 填充的值
void print(const vector<int>& vt)
{
	for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
	{
		std::cout << *it << " ";
	}
	std::cout << std::endl;
}

int main()
{
	vector<int> vt;
	for (int i = 0; i < 10; i++)
	{
		vt.push_back(i);
	}
	std::cout << "容器所有值信息:" << std::endl;
	print(vt);
	fill(vt.begin(), vt.end(), 3);
	std::cout << "填充容器所有值为3后:" << std::endl;
	print(vt);
}

执行结果

常用集合算法

set_intersection 求两个容器的交集

  • 功能描述:求两个容器的交集
  • 函数原型:
    set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
    • 求两个集合的交集
    • 两个容器必须是有序的
    • beg1 容器1开始迭代器
    • end1 容器1结束迭代器
    • beg2 容器2开始迭代器
    • end2 容器2结束迭代器
    • dest 目标容器开始迭代器

void Myprintf(int val)
{
	std::cout << val << " ";
}

int main()
{
	vector<int> vt;
	vector<int> vt2;
	for (int i = 0; i < 10; i++)
	{
		vt.push_back(i);
		vt2.push_back(i+1);
	}
	std::cout << "容器所有值信息:" << std::endl;
	for_each(vt.begin(), vt.end(), Myprintf);
	std::cout << std::endl;
	for_each(vt2.begin(), vt2.end(), Myprintf);
	std::cout << std::endl;
	vector<int> vt3;
	vt3.resize(min(vt.size(), vt2.size()));
	vector<int>::iterator it_end = set_intersection(vt.begin(), vt.end(), vt2.begin(), vt2.end(), vt3.begin());
	std::cout << "两个容器的交集为:" << std::endl;
	for_each(vt3.begin(), it_end, Myprintf);
	std::cout << std::endl;
}

结果信息

set_union 求两个容器的并集

  • 功能描述:求两个容器的并集
  • 函数原型:
    set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
    • 求两个集合的并集
    • 两个容器必须是有序的
    • beg1 容器1开始迭代器
    • end1 容器1结束迭代器
    • beg2 容器2开始迭代器
    • end2 容器2结束迭代器
    • dest 目标容器开始迭代器
void Myprintf(int val)
{
	std::cout << val << " ";
}

int main()
{
	vector<int> vt;
	vector<int> vt2;
	for (int i = 0; i < 10; i++)
	{
		vt.push_back(i);
		vt2.push_back(i+1);
	}
	std::cout << "容器所有值信息:" << std::endl;
	for_each(vt.begin(), vt.end(), Myprintf);
	std::cout << std::endl;
	for_each(vt2.begin(), vt2.end(), Myprintf);
	std::cout << std::endl;
	vector<int> vt3;
	vt3.resize(vt.size() + vt2.size());
	vector<int>::iterator it_end = set_union(vt.begin(), vt.end(), vt2.begin(), vt2.end(), vt3.begin());
	std::cout << "两个容器的并集为:" << std::endl;
	for_each(vt3.begin(), it_end, Myprintf);
	std::cout << std::endl;
}

执行结果

set_difference 求两个容器的差集

  • 功能描述:求两个容器的差集
  • 函数原型:
    set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
    • 求两个集合的差集
    • 两个容器必须是有序的
    • beg1 容器1开始迭代器
    • end1 容器1结束迭代器
    • beg2 容器2开始迭代器
    • end2 容器2结束迭代器
    • dest 目标容器开始迭代器
void Myprintf(int val)
{
	std::cout << val << " ";
}

int main()
{
	vector<int> vt;
	vector<int> vt2;
	for (int i = 0; i < 10; i++)
	{
		vt.push_back(i);
		vt2.push_back(i+1);
	}
	std::cout << "容器所有值信息:" << std::endl;
	for_each(vt.begin(), vt.end(), Myprintf);
	std::cout << std::endl;
	for_each(vt2.begin(), vt2.end(), Myprintf);
	std::cout << std::endl;
	vector<int> vt3;
	vt3.resize(max(vt.size(),vt2.size()));
	vector<int>::iterator it_end = set_difference(vt.begin(), vt.end(), vt2.begin(), vt2.end(), vt3.begin());
	std::cout << "两个容器的差集为:" << std::endl;
	for_each(vt3.begin(), it_end, Myprintf);
	std::cout << std::endl;
}

执行结果

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

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

相关文章

Java获取Jar、War包路径,并生成可编辑修改的本地配置文件

前言 本地的可修改配置文件的编写理应是一个很常用的功能&#xff0c;但由于数据库的存在&#xff0c;它鲜少被提及&#xff0c;大多数我们直接存储到数据库中了。 以至于现今&#xff0c;除了没接触数据库的新手时常使用它以外&#xff0c;它没有太多的出场机会。 也因此&am…

第九章认识Express模板

基本概述 Express模板是指Express框架中用于渲染视图的文件&#xff0c;可以包含HTML、CSS、JavaScript等内容&#xff0c;用于构建Web应用程序的用户界面。 使用Express模板可以快速、方便地创建Web应用程序&#xff0c;并且可以轻松地将动态数据注入到模板中&#xff0c;以…

印染污水处理设备有哪些分类

印染污水处理设备有多种分类方法。根据处理方法&#xff0c;可以分为物理法、化学法、生物法等。 物理法处理设备主要包括格栅、沉淀池、过滤器等&#xff0c;利用物理分离、去除的原理&#xff0c;将污水中的悬浮物和沉淀物去除。化学法处理设备主要包括混凝和氧化等&#xf…

Abaqus 2023有哪些新功能?

Fe-safe/Isight/Tosca2022新功能 近日&#xff0c;达索3ds官网发布了Abaqus 2023的最新消息&#xff0c;在接下来的数周内&#xff0c;SIMULIA套件GA版将正式与大家见面。 据悉&#xff0c;Abaqus 2023整合了该级别的最新功能和上一个级别的前四个补丁版的新增/增强功能&#…

安防监控展示预约小程序的作用如何

监控在生活中的用途非常广泛&#xff0c;普遍应用于小区门户、商业大厦、产业基地、家庭、汽车等场景中&#xff0c;市场需求较大&#xff0c;同时随着科技发展&#xff0c;安防监控产品更新迭代也比较快&#xff0c;衍生出的经销店、安装技术工等产业近些年也比较火。 安防监…

Elasticsearch搜索分析引擎本地部署与远程访问

文章目录 系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装 Cpolar4. 创建Elasticsearch公网访问地址5. 远程访问Elasticsearch6. 设置固定二级子域名 Elasticsearch是一个基于Lucene库的分布式搜索和分析引擎&#xff0c;它提供了一个分布式、多…

中移链共识机制介绍

01 为什么需要共识 共识是对某事达成的共同看法&#xff0c;它是区块链的灵魂&#xff0c;对确保区块链的完整性和安全性起着至关重要的作用。在传统的集中式系统中&#xff0c;单个实体或一组实体有权验证和记录交易。然而&#xff0c;区块链中的一个核心概念是去中心化&…

LeetCode - 160. 相交链表(C语言,配图)

思路&#xff1a; 1. 我们算出两个链表的长度lenA&#xff0c;lenB。我们在这里最后判断一下&#xff0c;两个链表的尾节点是否是一样的&#xff0c;如果是相交链表&#xff0c;那它们的尾节点一定是一样的。 2. 算出长链表和短链表的差距n&#xff08;n | lenA- lenB |&#…

年产200万件的超级工厂投产!巨头「闭环」汽车电子全产业链

随着汽车电动化程度的提升&#xff0c;汽车电子部件占整车成本比重逐步升高&#xff0c;已经从2012年的25%上升到2021年的55%。 且汽车电子电气架构向整车集中演进&#xff0c;智能汽车已经进入了软件及数据定义时代&#xff0c;底层硬件打破了过去几十年围绕特定应用不断增加…

MySQL5.7和MySQL8对比分析

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; MySQL学习 ✨特色专栏&#xff1a; My…

使用CycleGAN训练自己的数据集

一、下载源码 源码下载链接&#xff1a;https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix 二、调整自己的数据集格式 按照如下格式放 三、安装好所需要的python包 使用命令&#xff1a;pip install 包名称 在anaconda里面安装&#xff0c; 四、训练和测试 在开始训…

【算法】最短路径——弗洛伊德 (Floyd) 算法

目录 1.概述2.代码实现3.扩展3.应用 1.概述 &#xff08;1&#xff09;弗洛伊德 (Floyd) 算法又称为插点法&#xff0c;是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法&#xff0c;与 Dijkstra 算法类似。该算法名称以创始人之一、1978 年图灵奖获得者、…

应用在智能照明系统中的LED防蓝光灯珠

智能照明系统是利用电磁调压及电子感应技术&#xff0c;对供电进行实时监控与跟踪&#xff0c;自动平滑地调节电路的电压和电流幅度&#xff0c;改善照明电路中不平衡负荷所带来的额外功耗&#xff0c;提高功率因数&#xff0c;降低灯具和线路的工作温度&#xff0c;达到优化供…

到手价的低价监测怎么做到

品牌在做数据监测时&#xff0c;要考虑是否是到手价的监测&#xff0c;如果只是监测页面价的低价&#xff0c;真实情况是会漏掉很多的低价数据&#xff0c;如果是做经销商的低价监测工作&#xff0c;这样的监测方式下的数据会降低品牌对渠道的掌控力&#xff0c;因为监测的不是…

PPP协议_基础知识

ppp协议 点对点协议PPP(Point-to-Point Protocol)是目前使用最广泛的点对点数据链路层协议。 一.ppp协议的组成 PPP协议为在点对点链路传输各种协议数据报提供了一个标准方法&#xff0c;主要由以下三部分构成: 对各种协议数据报的封装方法(封装成帧)链路控制协议LCP    …

揭秘2023年最热门的跨境电商源码趋势,你不能错过的关键信息

随着全球市场的不断扩大和国际贸易的加速&#xff0c;跨境电商源码正成为越来越多企业的首选。在本文中&#xff0c;我们将揭秘2023年跨境电商源码的最新趋势&#xff0c;为您带来关键信息&#xff0c;帮助您抓住机遇&#xff0c;实现商业成功。 2023年跨境电商源码趋势解析 …

JS-项目实战-鼠标悬浮设置字体颜色以及控制键盘输入

1、fruit.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格的所有的行&a…

Go 使用Viper处理Go应用程序的配置

在开发Go应用程序时&#xff0c;处理配置是一个常见的需求。配置可能来自于配置文件、环境变量、命令行参数等等。Viper是一个强大的库&#xff0c;可以帮助我们处理这些配置。 什么是Viper&#xff1f; Viper是一个应用程序配置解决方案&#xff0c;用于Go应用程序。它支持JS…

推介会如何做好媒体宣传

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 推介会是一种专为企业、社会组织和团体、政府等提供的展示自身特点、产品和政策的活动形式&#xff0c;旨在促进交流活动&#xff0c;形成合作&#xff0c;从而带来共同利益。推介会的本…

ffmpeg 4.4 cenc-aes-ctr 加解密 MP4 工程性质分析

目录 一、cenc-aes-ctr 原理介绍 二、显式 cenc-aes-ctr 和隐式 cenc-aes-ctr 三、加密工具---ffmpeg 四、播放---ffplay 五、总结 ​​​​​​​一、cenc-aes-ctr 原理介绍 加密算法&#xff1a;CENC-AES-CTR 使用 AES&#xff08;Advanced Encryption Standard&…