14.STL 常用算法

14、STL常用算法

概述:

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

14.1 常用遍历算法

学习目标:

  • 掌握常用的遍历算法

算法简介:

for_each	//遍历容器
treansform	//搬运容器到另一个容器中

14.2 for_each

功能描述:

  • 实现遍历容器

函数原型:

  • for_each(iterator beg, iterator end, _func);
  • // 遍历算法 遍历容器元素
    // beg 开始迭代器
    // end 结束迭代器
    // _func 函数或者函数对象
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;void print01(int val) {cout << val << " ";
}// 函数对象
class print02 {
public:void operator()(int val) {cout << val << " ";}
};// for_each 算法基本用法
void test01() {vector<int> v;for (int i = 0; i < 20; ++i) {v.push_back(i);}// 遍历算法for_each(v.begin(), v.end(), print01);cout << endl;for_each(v.begin(), v.end(), print02());cout << endl;
}int main() {test01();system("pause");return 0;
}

总结:

  • for_each 在实际开发中是最常用遍历算法,需要熟练掌握

14.3 transform

功能描述:

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

函数原型:

  • transform(iterator beg1, iterator end1, iterator beg2, _func);
  • // beg1 源容器开始迭代器
    // end1 源容器结束迭代器
    // beg2 目标容器开始迭代器
    // _func 函数或者函数对象
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;class TransForm {
public:int operator()(int val) {return val;}
};
class MyPrint {
public:void operator()(int val) {cout << val << " ";}
};void test01() {vector<int>v;for (int i = 0; i < 10; ++i) {v.push_back(i);}vector<int>vTarget;			// 目标容器vTarget.resize(v.size());	// 目标容器需要提前开辟空间transform(v.begin(), v.end(), vTarget.begin(), TransForm());for_each(vTarget.begin(), vTarget.end(), MyPrint());
}int main() {test01();system("pause");return 0;
}

总结:

  • 搬运的目标容器必须要提前开辟空间,否则无法正常搬运

14.4 常用查找算法

学习目标:

  • 掌握常用的查找算法

算法简介:

find 			// 查找元素
find_if 		// 按条件查找元素
adjacent_find 	// 查找相邻重复元素
binary_search 	// 二分查找法
count 			// 统计元素个数
count_if 		// 按条件统计元素个数

14.5 find

功能描述:

  • 查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器 end()

函数原型:

find(iterator beg, iterator end, value);
  • // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
  • // beg 开始迭代器
  • // end 结束迭代器
  • // value 查找的元素
#include <iostream>
#include <vector>
#include <string>
using namespace std;void test01() {vector<int> v;for (int i = 0; i < 10; ++i) {v.push_back(i + 1);}// 查找容器中是否有5这个元素vector<int>::iterator it = find(v.begin(), v.end(), 5);if (it == v.end()) {cout << "没有找到!" << endl;}else {cout << "找到:" << *it << endl;}
}class Person {
public:Person(string name, int age) {this->m_Name = name;this->m_Age = age;}bool operator==(const Person& p) {if (this->m_Name == p.m_Name && this->m_Age == p.m_Age) {return true;}return false;}
public:string m_Name;int m_Age;
};void test02() {vector<Person> v;// 创建数据Person p1("aaa", 10);Person p2("bbb", 20);Person p3("ccc", 30);Person p4("ddd", 40);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);vector<Person>::iterator it = find(v.begin(), v.end(), p2);if (it == v.end()) {cout << "没有找到!" << endl;}else {cout << "找到姓名:" << it->m_Name << " 年龄:" << it->m_Age << endl;}
}int main() {test01();test02();system("pause");return 0;
}

总结:

  • 利用 find 可以在容器中找指定的元素,返回值是迭代器

14.6 find_if

功能描述:

  • 按条件查找元素

函数原型:

  • find_if(iterator beg, iterator end, _Pred);
  • // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
    // beg 开始迭代器
    // end 结束迭代器
    // _Pred 函数或者谓词(返回bool类型的仿函数)
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;// 内置数据类型
class GreaterFive {
public:bool operator()(int val) {return val > 5;}
};void test01() {vector<int>v;for (int i = 0; i < 10; ++i) {v.push_back(i + 1);}vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());if (it == v.end()) {cout << "没有找到!" << endl;}else {cout << "找到大于5的数字:" << *it << endl;}
}class Person {
public:Person(string name, int age) {this->m_Name = name;this->m_Age = age;}
public:string m_Name;int m_Age;
};class Greater20 {
public:bool operator()(Person& p) {return p.m_Age > 20;}
};void test02() {vector<Person>v;//创建数据Person p1("aaa", 10);Person p2("bbb", 20);Person p3("ccc", 30);Person p4("ddd", 40);vector<Person>::iterator it = find_if(v.begin(), v.end(), Greater20());if (it == v.end()) {cout << "没有找到!" << endl;}else {cout << "找到姓名:" << it->m_Name << " 年龄:" << it->m_Age << endl;}
}int main() {//test01();test02();system("pause");return 0;
}

总结:

  • find_if 按条件查找使查找更加灵活,提供的仿函数可以改变不同的策略

14.7 adjacent_find

功能描述:

  • 查找相邻重复元素

函数原型:

  • adjacent_find(iterator beg, iterator end);
  • // 查找相邻重复元素,返回相邻元素的第一个位置的迭代器
    // beg 开始迭代器
    // end 结束迭代器
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;void test01() {vector<int> v;v.push_back(1);v.push_back(7);v.push_back(3);v.push_back(4);v.push_back(6);v.push_back(8);v.push_back(4);//查找相邻重复元素vector<int>::iterator it = adjacent_find(v.begin(), v.end());if (it == v.end()) {cout << "找不到!" << endl;}else {cout << "找到相邻重复元素为:" << *it << endl;}
}

总结:

  • 面试题中如果出现查找相邻重复元素,记得用 STL 中的 adjacent_find 算法

14.8 binary_search

功能描述:

  • 查找指定元素是否存在

函数原型:

  • bool binary_search(iterator beg, iterator end, value);
  • // 查找指定的元素,查到 返回true 否则false
    // 注意: 在无序序列中不可用
    // beg 开始迭代器
    // end 结束迭代器
    // value 查找的元素
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void test01() {vector<int> v;for (int i = 0; i < 10; ++i) {v.push_back(i);}// 二分查找bool ret = binary_search(v.begin(), v.end(), 2);if (ret) {cout << "找到了" << endl;}else {cout << "未找到" << endl;}
}int main() {test01();system("pause");return 0;
}

总结:

  • 二分查找法查找效率很高,值得注意的是查找的容器中元素必须的有序序列

14.9 count

功能描述:

  • 统计元素个数

函数原型:

  • count(iterator beg, iterator end, value);
  • // 统计元素出现次数
    // beg 开始迭代器
    // end 结束迭代器
    // value 统计的元素
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;// 内置数据类型
void test01() {vector<int>v;v.push_back(1);v.push_back(3);v.push_back(5);v.push_back(3);v.push_back(9);v.push_back(3);int num = count(v.begin(), v.end(), 4);cout << "4的个数为:" << num << endl;
}// 自定义数据类型
class Person {
public:Person(string name, int age) {this->m_Name = name;this->m_Age = age;}bool operator==(const Person& p) {if (this->m_Age == p.m_Age) {return true;}else {return false;}}
public:string m_Name;int m_Age;
};void test02() {vector<Person> v;Person p1("刘备", 30);Person p2("关羽", 35);Person p3("张飞", 35);Person p4("赵云", 30);Person p5("曹操", 25);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);Person p("诸葛亮", 35);int num = count(v.begin(), v.end(), p);cout << "num = " << num << endl;
}int main() {//test01();test02();system("pause");return 0;
}

总结:

  • 统计自定义数据类型时候,需要配合重载 operator==

14.10 count_if

功能描述:

  • 按条件统计元素个数

函数原型:

  • count_if(iterator beg, iterator end, _Pred);
    // 按条件统计元素出现次数
    // beg 开始迭代器
    // end 结束迭代器
    // _Pred 谓词
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;class Greater4 {
public:bool operator()(int val) {return val >= 4;}
};//内置数据类型
void test01() {vector<int>v;v.push_back(1);v.push_back(2);v.push_back(5);v.push_back(3);v.push_back(4);v.push_back(4);int num = count_if(v.begin(), v.end(), Greater4());cout << "大于4的个数为:" << num << endl;
}// 自定义数据类型
class Person {
public:Person(string name, int age) {this->m_Name = name;this->m_Age = age;}
public:string m_Name;int m_Age;
};
class AgeLess35 {
public:bool operator()(const Person& p) {return p.m_Age < 35;}
};
void test02()
{vector<Person> v;Person p1("刘备", 35);Person p2("关羽", 35);Person p3("张飞", 35);Person p4("赵云", 30);Person p5("曹操", 25);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);int num = count_if(v.begin(), v.end(), AgeLess35());cout << "小于35岁的个数:" << num << endl;
}
int main() {//test01();test02();system("pause");return 0;
}

总结:

  • 按值统计用 count,按条件统计用 count_if

14.11 常用排序算法

学习目标:

  • 掌握常用的排序算法

算法简介:

sort 			//对容器内元素进行排序
random_shuffle 	//洗牌 指定范围内的元素随机调整次序
merge 			// 容器元素合并,并存储到另一容器中
reverse 		// 反转指定范围的元素

14.12 sort

功能描述:

  • 对容器内元素就行排序

函数原型:

  • sort(iterator beg, iterator end, __Pred);

    // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
    // beg 开始迭代器
    // end 结束迭代器
    // _Pred 谓词

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;void myPrint(int val) {cout << val << " ";
}
void test01() {vector<int> v;v.push_back(10);v.push_back(30);v.push_back(50);v.push_back(20);v.push_back(40);// sort 默认从小到大排序sort(v.begin(), v.end());for_each(v.begin(), v.end(), myPrint);cout << endl;// 从大到小排序sort(v.begin(), v.end(), greater<int>());for_each(v.begin(), v.end(), myPrint);cout << endl;
}int main() {test01();system("pause");return 0;
}

14.13 random_shuffle

功能描述:

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

函数原型:

  • random_shuffle(iterator beg, iterator end);

    // 指定范围内的元素随机调整次序
    // beg 开始迭代器
    // end 结束迭代器

#include <iostream>
#include <algorithm>
#include <ctime>
#include <vector>
using namespace std;class myPrint {
public:void operator()(int val) {cout << val << " ";}
};
void test01() {srand((unsigned int)time(NULL));vector<int>v;for (int i = 0; i < 10; ++i) {v.push_back(i);}for_each(v.begin(), v.end(), myPrint());cout << endl;random_shuffle(v.begin(), v.end());for_each(v.begin(), v.end(), myPrint());cout << endl;
}int main() {test01();system("pause");return 0;
}

总结:

  • random_shuffle 洗牌算法比较实用,使用时记得加随机数种子

14.14 merge

功能描述:

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

函数原型:

  • merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);

    // 容器元素合并,并存储到另一容器中
    // 注意: 两个容器必须是有序的
    // beg1 容器1开始迭代器
    // end1 容器1结束迭代器
    // beg2 容器2开始迭代器
    // end2 容器2结束迭代器
    // dest 目标容器开始迭代器

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;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 + 1);}vector<int> vtarget;// 目标容器需要提前开辟空间vtarget.resize(v1.size() + v2.size());// 合并 需要两个有序序列merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vtarget.begin());for_each(vtarget.begin(), vtarget.end(), myPrint());cout << endl;
}
int main() {test01();system("pause");return 0;
}

总结:

  • merge 合并的两个容器必须的有序序列

14.15 reverse

功能描述:

  • 将容器内元素就行反转

函数原型:

  • reverse(interator beg, iterator end);

    // 反转指定范围的元素

    // beg 开始迭代器

    // end 结束迭代器

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;class myPrint {
public:void operator()(int val) {cout << val << " ";}
};void test01() {vector<int>v;v.push_back(10);v.push_back(30);v.push_back(50);v.push_back(20);v.push_back(40);cout << "反转前:" << endl;for_each(v.begin(), v.end(), myPrint());cout << endl;cout << "反转后:" << endl;reverse(v.begin(), v.end());for_each(v.begin(), v.end(), myPrint());cout << endl;
}int main() {test01();system("pause");return 0;
}

总结:

  • reverse 反转区间内元素,面试题可能涉及到

14.16 常用拷贝和替换算法

学习目标:

  • 掌握常用的拷贝和替换算法

算法简介:

copy 		// 容器内指定范围的元素拷贝到另一容器中
replace 	// 将容器内指定范围的旧元素修改为新元素
replace_if  // 容器内指定范围满足条件的元素替换为新元素
swap 		// 互换两个容器的元素

14.17 copy

功能描述:

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

函数原型:

  • copy(iterator beg, iterator end, iterator dest);

    // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
    // beg 开始迭代器
    // end 结束迭代器
    // dest 目标起始迭代器

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;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;
}

总结:

  • 利用 copy 算法在拷贝时,目标容器记得提前开辟空间

14.18 replace

功能描述:

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

函数原型:

  • replace(iterator beg, iterator end, oldvalue, newvalue);

    // 将区间内旧元素 替换成 新元素

    // beg 开始迭代器
    // end 结束迭代器
    // oldvalue 旧元素
    // newvalue 新元素

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;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 替换成2000cout << "替换后:" << endl;replace(v.begin(), v.end(), 20, 2000);for_each(v.begin(), v.end(), myPrint());cout << endl;
}int main() {test01();system("pause");return 0;
}

总结:

  • replace 会替换区间内满足条件的元素

14.19 replace_if

功能描述:

  • 将区间内满足条件的元素,替换成指定元素

函数原型:

  • replace_if(iterator beg, iterator end, _pred, newvalue);

    // 按条件替换元素,满足条件的替换成指定元素
    // beg 开始迭代器
    // end 结束迭代器
    // _pred 谓词
    // newvalue 替换的新元素

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;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 替换成 3000cout << "替换后:" << 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;
}

总结:

  • replace_if 按条件查找,可以利用仿函数灵活筛选满足的条件

14.20 swap

功能描述:

  • 互换两个容器的元素

函数原型:

  • swap(container c1, container c2);

    // 互换两个容器的元素

    // c1 容器1

    // c2 容器2

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;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;
}

总结:

  • swap 交换容器时,注意交换的容器要同种类型

14.21 常用算术生成算法

学习目标:

  • 掌握常用的算术生成算法

注意:

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

算法简介:

accumulate 	// 计算容器元素累计总和
fill 		// 向容器中添加元素

14.22 accumulate

功能描述:

  • 计算区间内 容器元素累计总和

函数原型:

  • accumulate(iterator beg, iterator end, value);

  • // 计算容器元素累计总和

  • // beg 开始迭代器

  • // end 结束迭代器

  • // value 起始值

#include <iostream>
#include <numeric>
#include <vector>
using namespace std;void test01() {vector<int>v;for (int i = 0; i <= 100; ++i) {v.push_back(i);}int total = accumulate(v.begin(), v.end(), 0);cout << "total = " << total << endl;
}
int main() {test01();system("pause");return 0;
}

总结:

  • accumulate 使用时头文件注意是 numeric,这个算法很实用

14.23 fill

功能描述:

  • 向容器中填充指定的元素

函数原型:

  • fill(iterator beg, iterator end, value);
  • // 向容器中填充元素
    // beg 开始迭代器
    // end 结束迭代器
    // value 填充的值
#include <iostream>
#include <numeric>
#include <vector>
#include <algorithm>
using namespace std;class myPrint {
public:void operator()(int val) {cout << val << " ";}
};void test01() {vector<int>v;v.resize(10);// 填充fill(v.begin(), v.end(), 100);for_each(v.begin(), v.end(), myPrint());cout << endl;
}int main() {test01();system("pause");return 0;
}

总结:

  • 利用 fill 可以将容器区间内元素填充为 指定的值

14.24 常用集合算法

学习目标:

  • 掌握常用的结合算法

算法简介:

set_intersection // 求两个容器的交集
set_union		 // 求两个容器的并集
set_difference	 // 求两个容器的差集

14.25 set_intersection

功能描述:

  • 求两个容器的交集

函数原型:

  • set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2,iterator dest);
  • // 求两个集合的交集
    // 注意:两个集合必须是有序序列
    // beg1 容器1开始迭代器
    // end1 容器1结束迭代器
    // beg2 容器2开始迭代器
    // end2 容器2结束迭代器
    // dest 目标容器开始迭代器
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;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 + 5);}vector<int> vTarget;// 取两个里面较小的值给目标容器开辟空间vTarget.resize(min(v1.size(), v2.size()));// 返回目标容器的最后一个元素的迭代器地址vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());for_each(vTarget.begin(), itEnd, myPrint());cout << endl;
}int main() {test01();system("pause");return 0;
}

总结:

  • 求交集的两个集合必须的有序序列
  • 目标容器开辟空间需要从两个容器中取小值
  • set_intersection 返回值既是交集中最后一个元素的位置

14.26 set_union

功能描述:

  • 求两个集合的并集

函数原型:

  • set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iteratordest);

    // 求两个集合的并集
    // 注意:两个集合必须是有序序列
    // beg1 容器1开始迭代器
    // end1 容器1结束迭代器
    // beg2 容器2开始迭代器
    // end2 容器2结束迭代器
    // dest 目标容器开始迭代器

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
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 + 5);}vector<int> vTarget;// 取两个容器的和给目标容器开辟空间vTarget.resize(v1.size() + v2.size());// 返回目标容器的最后一个元素的迭代器地址vector<int>::iterator itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());for_each(vTarget.begin(), itEnd, myPrint());cout << endl;
}int main() {test01();system("pause");return 0;
}

总结:

  • 求并集的两个集合必须的有序序列
  • 目标容器开辟空间需要两个容器相加
  • set_union返回值既是并集中最后一个元素的位置

14.27 set_difference

功能描述:

  • 求两个集合的差集

函数原型:

  • set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
  • // 求两个集合的差集
    // 注意:两个集合必须是有序序列
    // beg1 容器1开始迭代器
    // end1 容器1结束迭代器
    // beg2 容器2开始迭代器
    // end2 容器2结束迭代器
    // dest 目标容器开始迭代器
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;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 + 5);}vector<int> vTarget;// 取两个里面较大的值给目标容器开辟空间vTarget.resize(max(v1.size(), v2.size()));// 返回目标容器的最后一个元素的迭代器地址cout << "v1与v2的差集为: " << endl;vector<int>::iterator itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());for_each(vTarget.begin(), itEnd, myPrint());cout << endl;cout << "v2与v1的差集为: " << endl;itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());for_each(vTarget.begin(), itEnd, myPrint());cout << endl;}int main() {test01();system("pause");return 0;
}

总结:

  • 求差集的两个集合必须的有序序列
  • 目标容器开辟空间需要从两个容器取较大值
  • set_difference 返回值既是差集中最后一个元素的位置

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

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

相关文章

1.3 面试经典150题 - 删除有序数组中的重复项

删除有序数组中的重复项 class Solution:def removeDuplicates(self, nums: List[int]) -> int:# 处理边界数据if not nums: return 0if len(nums) 1: return 1# 两个指针&#xff0c;一个记录当前有多少个不重复值的个数&#xff0c;一个记录最新遍历到的值count 1tmp …

C# ObjectArx 绘制表格并设置单元格合并

第一行默认是标题&#xff0c;可设置行【RowType】进行设置类型 Document doc Application.DocumentManager.MdiActiveDocument;using (Transaction tr doc.TransactionManager.StartOpenCloseTransaction()){BlockTable bt tr.GetObject(doc.Database.BlockTableId, OpenMo…

GZ075 云计算应用赛题第9套

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷9 某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenSt…

Python3 中常用字符串函数介绍

介绍 Python 中有几个与 字符串数据类型相关的内置函数。这些函数让我们能够轻松修改和操作字符串。我们可以将函数视为在代码元素上执行的操作。内置函数是在 Python 编程语言中定义的&#xff0c;并且可以随时供我们使用的函数。 在本教程中&#xff0c;我们将介绍在 Pytho…

导轨式信号隔离变送器比例阀门线性驱动器4-20mA/0-5V/0-10V转0-165mA/0-80mA/0-1A/0-2A/0-4A

主要特性 精度、线性度误差等级&#xff1a; 0.1、0.2、0.5 级4-20mA/0-5V/0-10V 等标准信号输入0~100mA/0~500mA/0~1A/0-5A 等电流信号输出0~1V(max 2A)/0~10V/0-24V(max 5A) 等电压信号输出信号输入/信号输出 3000VDC 隔离辅助电源&#xff1a;12V、15V 或 24V 直流单电源供…

【微服务】日志搜集elasticsearch+kibana+filebeat(单机)

日志搜集eskibanafilebeat&#xff08;单机&#xff09; 日志直接输出到es中&#xff0c;适用于日志量小的项目 基于7.17.16版本 主要配置在于filebeat&#xff0c; es kibana配置改动不大 环境部署 es kibana单机环境部署 略 解压即可 常见报错&#xff0c;百度即可。 记录…

Android 和 IOS 设备唯一ID如何选择

我们在做Android/IOS应用或游戏的时候,或许总会碰到要获取设备唯一id来标识或跟踪玩家。但随着系统安全性的提高,加强用户的隐私安全,获取设备唯一ID变得越来越困难了,下面我们来分析一下,看看哪些还可以满足我们需求,同时,如果您有关于获取设备唯一ID的新发现,欢迎留言…

【Vue监听属性详细介绍】

Vue监听属性详细介绍 1. 监听属性2. watch 属性3. 计算属性&#xff08;Computed Properties&#xff09;4. 侦听器&#xff08;Listeners&#xff09;方法5. .sync 修饰符6. 注意事项 1. 监听属性 在Vue中&#xff0c;监听属性是一个十分重要的特性&#xff0c;它允许你监听和…

揭秘铭文技术: 它如何改变你的数字世界?

在数字世界的演变过程中&#xff0c;区块链技术被广泛认为是一种革命性的创新&#xff0c;为众多行业和领域带来深远的影响。然而&#xff0c;区块链的潜力远不止于此。近年来&#xff0c;一种新兴应用——区块链铭文&#xff0c;正在逐渐引起人们的关注&#xff0c;成为数字世…

修改csdn的字体大小颜色

修改csdn的字体大小颜色 修改csdn的字体大小颜色 修改csdn的字体大小颜色一、设置字体与颜色格式二、修改字体格式三、修改字体颜色 一、设置字体与颜色格式 <font face"华文行楷" colorred size5>本字体是华文行楷&#xff0c;红色&#xff0c;5号大小</fo…

怎样获取power shell 的全部可用命令?2/5(篇幅有点长,分成5份)

在power shell 窗口中&#xff0c;有一个获取全部可用命令的命令&#xff1a;get-command&#xff0c;获取到的命令有1640多个&#xff0c;够学习了吧&#xff1f;那么&#xff0c;power shell 命令有哪些类别呢&#xff1f; PowerShell命令可以分为以下几类&#xff1a; Cmdl…

TS学习笔记二:基础类型及变量声明

本节介绍TypeScript中的基础类型及变量声明方式的说明。TypeScript支持与JavaScript几乎相同的数据类型&#xff0c;此外还提供了实用的枚举类型方便我们使用。基础类型包括&#xff1a;数字&#xff0c;字符串&#xff0c;结构体&#xff0c;布尔值等。 学习视频 TS学习笔记二…

java发送邮件(注:本章以163邮箱为例)

目录 前言 一邮件服务器与传输协议 二.发送邮件思路 2.1注册163邮箱: 2.2、打开邮箱服务获取授权码 三.代码实现邮件发送 3.1第三方jar包 3.2创建邮件工具类 3.3编写测试类 前言 电子邮件的应用非常广泛&#xff0c;例如在某网站注册了一个账户&#xff0c;自动发送一…

机器学习在什么场景下最常用-九五小庞

机器学习在多个场景中都有广泛的应用&#xff0c;下面是一些常见的应用场景&#xff1a; 自然语言处理&#xff08;NLP&#xff09;&#xff1a;如语音识别、自动翻译、情感分析、垃圾邮件过滤等。数据挖掘和分析&#xff1a;如市场分析、用户画像、推荐系统、欺诈检测等。智能…

你不得不知道的常用 Git 命令

最近在学习的时候发现 git 命令没有自己想象中那么简单&#xff0c;特此做一期 《 常用 Git 命令 》&#xff0c;不仅是给掘友分享&#xff0c;也能巩固自己学到的知识。 在此向大家推荐一个学习 git 指令的小游戏 Learn Git Branching&#xff0c;以通关的方式进行学习&#…

人机协同控制的相位差

人机协同控制是指人与机器之间通过特定的交互方式进行协同工作&#xff0c;共同完成某项任务或控制某个系统。在这种控制方式下&#xff0c;人与机器根据各自的能力和优势&#xff0c;相互配合和协作&#xff0c;达到更高效、更精确的控制效果。 相位差是指两个波的相位差异&am…

2024年【高处安装、维护、拆除】考试题及高处安装、维护、拆除模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 高处安装、维护、拆除考试题是安全生产模拟考试一点通总题库中生成的一套高处安装、维护、拆除模拟试题&#xff0c;安全生产模拟考试一点通上高处安装、维护、拆除作业手机同步练习。2024年【高处安装、维护、拆除】…

电脑的任务栏怎么恢复到底下?简单的4个方法帮你解决!

“我在使用电脑的时候突然发现电脑底部的任务栏不见了&#xff0c;有什么方法可以将任务栏恢复到底下吗&#xff1f;快给我出出主意吧&#xff01;” 在使用电脑时&#xff0c;我们可能会发现电脑的任务栏跑到屏幕顶部或消失的情况。这不仅影响了我们的使用体验&#xff0c;还可…

如何使用左移方法优化性能测试

开发周期早期阶段的性能测试&#xff08;左移方法&#xff09;可以让产品提供更好的性能和更高的投资回报率。查看如何使用左移方法优化性能测试。 每一次冲刺都至关重要&#xff0c;并且做出的决策速度快如闪电。为了促进快速反馈过程&#xff0c;测试团队必须在很短的时间内…

JS逆向实战案例1——某房地产url动态生成

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、 反爬分析 url&#xff1a;aHR0cHM6Ly9uZXdob3VzZS4wNTU3ZmRjLmNvbQ 该站点项目url通过点击JS生成&#xff0c;project_id与生成后…