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

news2024/11/30 2:38:23

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;
}

执行结果

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

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

相关文章

Linux C/C++全栈开发知识图谱(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)

众所周知&#xff0c;在所有的编程语言中&#xff0c;C语言是一门颇具学习难度&#xff0c;需要很长学习周期的编程语言。甚至很多人经常听到一句调侃的话语——“C&#xff0c;从入门到放弃”。 C界的知名书籍特别多&#xff0c;从简单到高端书籍&#xff0c;许多书籍都是C之…

8086与8088

一、8086与8088概述 8088/8086都是16位微处理器&#xff0c;内部运算器和寄存器都是16位的&#xff0c;同样具有20位地址线8088/8086都是由执行单元(EU)和总线接口部件(BIU)两大部分构成指令系统和寻址能力都相同&#xff0c;两种CPU是兼容的8088被称作准十六位的、是紧继8086…

为什么红帽Linux值得学习?红帽Linux是什么

为什么红帽Linux值得学习 物联网、云计算、大数据&#xff0c;或许你都耳熟能详&#xff0c;但是Linux可能你却感觉到有点陌生。这些未来趋势的行业使用的嵌入式、c、JAVA、PHP等底层应用软件都是在Linux操作系统上Linux运维工程师作为移动互联网的关键支撑岗位&#xff0c;缺口…

Redis内存淘汰机制

Redis内存淘汰机制 引言 Redis 启动会加载一个配置&#xff1a; maxmemory <byte> //内存上限 默认值为 0 (window版的限制为100M)&#xff0c;表示默认设置Redis内存上限。但是真实开发还是需要提前评估key的体量&#xff0c;提前设置好内容上限。 此时思考一个问题…

避坑指南!!在树莓派4b上安装Pycharm以及无法使用终端的问题解决!!

一、下载Pycharm–linux安装包 这里是踩的第一个坑&#xff0c;一开始我下载的是pycharm2023-linux版本的。后面发现缺少很多东西&#xff0c;安装不成功。后面下载了低版本的Pycharm才可以。我下载的是2020版本的。注意&#xff1a;在下载安装包时&#xff0c;一定要在window…

小米手机获取电池健康度

目录 方法一&#xff1a;使用Bug反馈功能 1. 打开拨号界面&#xff0c;输入*#*#284#*#* 2. 导出结果&#xff0c;等待即可 3. 找到这个压缩文件 4. 解压缩【我这里直接拷贝到电脑中操作&#xff0c;手机同理】 4.1 解压&#xff1a; 4.2 将得到的新的压缩文档解压 5. 打…

Stages—研发过程可视化建模和管理平台

产品概述 Stages是美国UL Solutions旗下UL Method Park GmbH的产品&#xff0c;用于帮助企业定义、管理、发布、控制、优化其研发过程&#xff0c;同时使其研发过程符合CMMI、ASPICE、ISO26262等标准。Stages的核心理念是把过程理论和实际项目进行有机结合。Stages聚焦于研发过…

web环境实现一键式安装启动

部署的痛点 一般在客户环境安装web环境&#xff0c;少说需要花费1-2小时。一般需要安装jdk、nginx、mysql、redis等 等你接触到了inno setup &#xff0c;你有可能会节约更少的时间去部署。也有可能是一个不懂技术的人&#xff0c;都可以进行操作的。废话不多说&#xff0c;接…

JS原生-弹框+阿里巴巴矢量图

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…

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

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

【分享课】11月16日晚19:30PostgreSQL分享课:PG缓存管理器主题

PostsreSQL分享课分享主题: PG缓存管理器主题 直播分享平台&#xff1a;云贝教育视频号 时间&#xff1a;11月16日 周四晚 19: 30 分享内容: 缓冲区管理器结构 缓冲区管理器的工作原理 环形缓冲区 脏页的刷新

《洛谷深入浅出基础篇》 p3370字符串哈希——hash表

上链接&#xff1a; P3370 【模板】字符串哈希 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3370#submit上题干&#xff1a; 就是说&#xff0c;给你N个字符串&#xff0c;然后让你判断&#xff0c;这N个字符串里面有多少不同的字符串&am…

谭巍主任科普:面对HPV感染挑战,迈出关键一步!

在当今社会&#xff0c;HPV(人乳头瘤病毒)感染的问题日益凸显&#xff0c;它不仅限于性传播疾病&#xff0c;更上升为一种公共卫生问题。据统计&#xff0c;全球范围内每年有大量人群感染HPV&#xff0c;其中部分地区感染率高达50%。正因如此&#xff0c;谭巍主任投身于科普事业…

表单校验wed第十九章

常见的表单验证 一。表单选择器 属性过滤选择器 &#xff1a;selected 选中所有的下拉元素 &#xff1a;checked&#xff1a;选项元素 &#xff1a;disabled 不可用元素 &#xff1a;enable 所有可用元素 二。字符串演示 1.判断非空 isNaN(j) :判断是否为数字 2.表…

flutter绘制弧形进度条

绘制: import package:jade/utils/JadeColors.dart; import package:flutter/material.dart; import dart:math as math; import package:flutter_screenutil/flutter_screenutil.dart;class ArcProgressBar extends StatefulWidget{const ArcProgressBar({Key key}) : super…

蘑菇街获得mogujie商品详情 API 返回值说明

速卖通API接口是速卖通平台提供的一种数据交换接口&#xff0c;可以帮助卖家快速获取平台上的商品信息、订单信息、用户信息等数据&#xff0c;以便在自己的应用程序中进行展示、管理或分析。 速卖通API接口可以通过以下步骤进行使用&#xff1a; 注册速卖通账号并获取API密钥…

SystemVerilog学习 (7)——面向对象编程

一、概述 对结构化编程语言,例如Verilog和C语言来讲&#xff0c;它们的数据结构和使用这些数据结构的代码之间存在很大的沟壑。数据声明、数据类型与操作这些数据的算法经常放在不同的文件里,因此造成了对程序理解的困难。 Verilog程序员的境遇比C程序员更加棘手,因为 Verilog …

React父组件怎么调用子组件的方法

调用方法&#xff1a;1、类组件中的调用可以利用React.createRef()、ref的函数式声明或props自定义onRef属性来实现&#xff1b;2、函数组件、Hook组件中的调用可以利用useImperativeHandle或forwardRef抛出子组件ref来实现。 【程序员必备开发工具推荐】Apifox一款免费API管理…

STM32CubeIDE报“xxx is not implemented and will always fail”解决方法

本文介绍STM32CubeIDE报“xxx is not implemented and will always fail”解决方法。 最近用STM32CubeIDE开发STM32程序时&#xff0c;编译报警告&#xff1a; warning: _close is not implemented and will always fail warning: _lseek is not implemented and will always…

顺序表在线OJ题(详解+图解)

1&#xff1a;原地移除数组中所有的元素val&#xff08;时间复杂度为O(N)空间复杂度为O(1)&#xff09; 题目的大概意思是&#xff1a;用户自行输入一个数组&#xff0c;还要输入一个val的整形值&#xff0c;然后从数组中移除等于val的元素 我们根据题目的要求&#xff0c;时间…