【C++提高】算法

算法

  • 一、遍历算法
    • 1. for_each
    • 2. transform
  • 二、查找算法
    • 1. find
    • 2. find_if
    • 3. adjacent_find
    • 4. binary_search
    • 5. count
    • 6. count_if
  • 三、排序算法
    • 1. sort
    • 2. random_shuffle
    • 3. merge
    • 4. reverse
  • 四、拷贝和替换算法
    • 1. copy
    • 2. replace
    • 3. replace_if
    • 4. swap
  • 五、算术生成算法
    • 1. accumulate
    • 2. fill
  • 六、集合算法
    • 1. set_intersection
    • 2. set_union
    • 3. set_difference
  • 七、用法对比

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

一、遍历算法

1. for_each

实现遍历容器,函数原型为for_each(iterator beg, iterator end, _func); 。其中,beg为开始迭代器,end为结束迭代器,_func为函数或者函数对象。

#include <algorithm>
#include <vector>//普通函数
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 < 10; 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;
}

2. transform

搬运容器到另一个容器中,函数原型为transform(iterator beg1, iterator end1, iterator beg2, _func);。其中,beg1为源容器开始迭代器,end1为源容器结束迭代器,beg2为目标容器开始迭代器,_func为函数或者函数对象。注意,目标容器需要提前开辟空间。

#include<vector>
#include<algorithm>//常用遍历算法  搬运 transformclass 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;
}

二、查找算法

1. find

查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()。函数原型为find(iterator beg, iterator end, value); 。其中,beg为开始迭代器,end为结束迭代器,value为查找的元素。

#include <algorithm>
#include <vector>
#include <string>
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;}
}

2. find_if

按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置。函数原型为find_if(iterator beg, iterator end, _Pred); 。其中,beg为开始迭代器,end为结束迭代器,_Pred为函数或者谓词(返回bool类型的仿函数)。

#include <algorithm>
#include <vector>
#include <string>//内置数据类型
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);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);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;
}

3. adjacent_find

查找相邻重复元素,返回相邻元素的第一个位置的迭代器。函数原型为adjacent_find(iterator beg, iterator end); 。其中,beg为开始迭代器,end为结束迭代器。

#include <algorithm>
#include <vector>void test01()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(5);v.push_back(2);v.push_back(4);v.push_back(4);v.push_back(3);//查找相邻重复元素vector<int>::iterator it = adjacent_find(v.begin(), v.end());if (it == v.end()) {cout << "找不到!" << endl;}else {cout << "找到相邻重复元素为:" << *it << endl;}
}

4. binary_search

查找指定的元素,查到返回true,否则返回false。该算法在无序序列中不可用。函数原型
bool binary_search(iterator beg, iterator end, value); 。其中,beg为开始迭代器,end为结束迭代器,value为查找的元素。

#include <algorithm>
#include <vector>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;
}

5. count

统计元素出现次数。函数原型为count(iterator beg, iterator end, value);。其中,beg为开始迭代器,end为结束迭代器,value为统计的元素。

#include <algorithm>
#include <vector>//内置数据类型
void test01()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(4);v.push_back(5);v.push_back(3);v.push_back(4);v.push_back(4);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;}}string m_Name;int m_Age;
};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);Person p("诸葛亮",35);int num = count(v.begin(), v.end(), p);cout << "num = " << num << endl;
}
int main() {//test01();test02();system("pause");return 0;
}

6. count_if

按条件统计元素出现次数。函数原型为count_if(iterator beg, iterator end, _Pred);。其中,beg为开始迭代器,end为结束迭代器,_Pred为函数或者谓词(返回bool类型的仿函数)。

#include <algorithm>
#include <vector>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(4);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;}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;
}

三、排序算法

1. sort

对容器内元素进行排序。函数原型为sort(iterator beg, iterator end, _Pred);。其中,beg为开始迭代器,end为结束迭代器,_Pred为函数或者谓词(返回bool类型的仿函数)。

#include <algorithm>
#include <vector>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;
}

2. random_shuffle

指定范围内的元素随机调整次序。函数原型为random_shuffle(iterator beg, iterator end);。其中,beg为开始迭代器,end为结束迭代器。使用时记得加随机数种子srand((unsigned int)time(NULL));

#include <algorithm>
#include <vector>
#include <ctime>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;
}

3. merge

两个容器元素合并,并存储到另一容器中。函数原型为merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);。两个容器必须是有序的。其中,beg1是容器1开始迭代器,end1是容器1结束迭代器,beg2是容器2开始迭代器,end2是容器2结束迭代器,dest是目标容器开始迭代器。注意,目标容器需要提前开辟空间。

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

4. reverse

将容器内元素进行反转。函数原型为reverse(iterator beg, iterator end);。其中,beg为开始迭代器,end为结束迭代器。

#include <algorithm>
#include <vector>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;
}

四、拷贝和替换算法

1. copy

容器内指定范围的元素拷贝到另一容器中。函数原型为copy(iterator beg, iterator end, iterator dest);。其中,beg为开始迭代器,end为结束迭代器,dest为目标开始迭代器。注意,需要提前为目标容器开辟空间。

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

2. replace

将容器内指定范围的旧元素修改为新元素。函数原型为replace(iterator beg, iterator end, oldvalue, newvalue);。其中,beg为开始迭代器,end为结束迭代器,oldvalue为旧元素,newvalue为新元素。

#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 替换成 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;
}

3. replace_if

将区间内满足条件的元素,替换成指定元素。函数原型为replace_if(iterator beg, iterator end, _pred, newvalue);。其中,beg为开始迭代器,end为结束迭代器,_Pred为函数或者谓词(返回bool类型的仿函数),newvalue为新元素。

#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 替换成 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;
}

4. swap

互换两个容器的元素。函数原型为swap(container c1, container c2);。其中,c1和c2为两个需要互换的容器。注意,互换的容器需要同种类型。

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

五、算术生成算法

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

1. accumulate

计算区间内容器元素累计总和。函数原型为accumulate(iterator beg, iterator end, value);。其中,beg为开始迭代器,end为结束迭代器,value为叠加起始值。

#include <numeric>
#include <vector>
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;
}

2. fill

向容器中填充指定的元素。函数原型为fill(iterator beg, iterator end, value);。其中,beg为开始迭代器,end为结束迭代器,value为填充的值。

#include <numeric>
#include <vector>
#include <algorithm>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;
}

六、集合算法

1. set_intersection

求两个容器的交集。函数原型为set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);。其中,beg1为容器1开始迭代器,end1为容器1结束迭代器,beg2为容器2开始迭代器,end2为容器2结束迭代器,dest为目标容器开始迭代器,返回值为填充后的迭代器。注意,两个集合必须是有序序列,且目标容器需要提前开辟空间,目标容器开辟空间需要从两个容器中取小值。

#include <vector>
#include <algorithm>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;
}

2. set_union

求两个集合的并集。函数原型为set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);。其中,beg1为容器1开始迭代器,end1为容器1结束迭代器,beg2为容器2开始迭代器,end2为容器2结束迭代器,dest为目标容器开始迭代器,返回值为填充后的迭代器。注意,两个集合必须是有序序列,且目标容器需要提前开辟空间,目标容器开辟空间需要两个容器相加。

#include <vector>
#include <algorithm>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;
}

3. set_difference

求两个集合的差集。函数原型为set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);。其中,beg1为容器1开始迭代器,end1为容器1结束迭代器,beg2为容器2开始迭代器,end2为容器2结束迭代器,dest为目标容器开始迭代器,返回值为填充后的迭代器。注意,两个集合必须是有序序列,且目标容器需要提前开辟空间,目标容器开辟空间需要两个容器取较大值。

#include <vector>
#include <algorithm>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和map是否对内部数据顺序有要求是否支持内部数据为自定义类型
for_each支持无要求支持
transform支持无要求支持
find支持无要求支持但自定义类需要重载运算符==
find_if支持无要求支持但需要加入谓词做参数
adjacent_find不支持无要求支持但需要加入谓词做参数
swap支持无要求支持
binary_search支持必须升序不支持
count支持无要求支持但自定义类需要重载运算符==
count_if支持无要求支持但需要加入谓词做参数
sort不支持无要求支持但需要加入谓词做参数
random_shuffle不支持无要求支持
merge不支持必须升序不支持
reverse不支持无要求支持
copy不支持无要求支持
replace不支持无要求支持但自定义类需要重载运算符==
replace_if不支持无要求支持但需要加入谓词做参数
swap支持无要求支持
accumulate支持无要求支持
fill不支持无要求支持
set_intersection不支持必须升序不支持
set_union不支持必须升序不支持
set_difference不支持必须升序不支持

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

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

相关文章

AOP

代理模式 提出问题 现有缺陷 假设我们有一个计算类&#xff0c;里面有加减乘除四个方法&#xff0c;现在我们要为这四个方法添加日志&#xff0c;即在方法执行的前后分别输出一句话&#xff0c;这时我们会发现如下缺陷&#xff1a; 1.对核心业务有干扰。核心业务是加减乘除…

货拉拉0-1数据指标体系构建与应用

目录 一、背景 二、指标体系搭建 2.1 指标设计 2.2 指标体系搭建 2.3 指标维度拆解 三、指标标准化建设 四、指标元数据管理 五、指标应用&未来规划 原文大佬介绍的这篇指标体系构建有借鉴意义&#xff0c;现摘抄下来用作沉淀学习。如有侵权请告知~ 一、背景 指标…

汽车摄像头匿名化处理解决方案,保护信息的安全性和隐私性

随着智能交通和自动驾驶技术的迅猛发展&#xff0c;汽车摄像头已成为现代汽车不可或缺的一部分&#xff0c;摄像头所捕捉的图像信息也引发了日益严峻的信息安全问题。如何在充分利用摄像头功能的同时&#xff0c;保障个人隐私和信息安全&#xff0c;已成为企业亟待解决的问题。…

IP地址定位技术引发的个人隐私保护问题

IP地址定位技术对互联网的影响深远且多面&#xff0c;它不仅改变了网络管理与优化的方式&#xff0c;还极大地推动了在线广告营销、电子商务、地理信息服务等多个领域的发展。然而&#xff0c;与此同时&#xff0c;它也引发了一系列关于个人隐私保护的问题。 首先&#xff0c;I…

vue的学习之用vue写一个hello,vue

根据以下步骤下载vue.js 介绍 — Vue.js 创建一个damo.html &#xff0c;引入vue.js即可 <body><div id"app">{{ message }}</div><!-- Vue --><!-- 开发环境版本&#xff0c;包含了有帮助的命令行警告 --><script src"js/vu…

清华新突破,360°REA重塑多智能体系统:全方位提升复杂任务表现

引言&#xff1a;多智能体系统的新篇章——360REA框架 在多智能体系统的研究领域&#xff0c;最新的进展揭示了一种全新的框架——360REA&#xff08;Reusable Experience Accumulation with 360 Assessment&#xff09;。这一框架的提出&#xff0c;不仅是对现有系统的一次重大…

Git提交/拉取的顺序

Git提交代码的流程 1、git add . 2、git commit -m “commit info” 3、git pull origin master 4、git push origin master 第一步表示将本地所有改动代码添加到暂存区 第二步表示将待提交内容和描述信息放到本次提交中 第三步表示将远程代码更新到本地&#xff08;用于解决冲…

P8739 [蓝桥杯 2020 国 C] 重复字符串

[蓝桥杯 2020 国 C] 重复字符串 题目描述 如果一个字符串 S S S 恰好可以由某个字符串重复 K K K 次得到&#xff0c;我们就称 S S S 是 K K K 次重复字符串。例如 abcabcabc 可以看作是 abc 重复 3 3 3 次得到&#xff0c;所以 abcabcabc 是 3 3 3 次重复字符串。 同…

nodejs 版本管理

nvm介绍 管理windows系统下nodejs的多个版本&#xff0c;包括安装、卸载、切换等功能。 安装nvm 在github官网下载nvm的安装包&#xff0c;下载完成之后安装即可。 nvm的基本用法 查看当前nodejs的版本 使用nvm list查看以安装的版本以及当前版本&#xff0c;前面带有*的…

如何修改WordPress数据库表前缀以提高安全性

WordPress作为世界上最受欢迎的内容管理系统之一&#xff0c;吸引了数以百万计的用户。然而&#xff0c;正因为其广泛的使用&#xff0c;WordPress网站也成为了黑客攻击的目标之一。其中一个最常见的安全漏洞是使用默认的数据库表前缀wp_&#xff0c;使得黑客能够更轻松地进行大…

Oracle交换分区测试

1、用exchange分区表减少初始化过程中对业务中断的影响 2、创建分区表 create table t_p (id number,name varchar2(30),addr varchar2(50)) partition by range(id) (partition p1 values less than(10), partition p2 values less than(20), partition p3 values less …

【Python快速上手(一)】

目录 Python快速上手&#xff08;一&#xff09;Python3 基础语法1. 编码2. 标识符3. Python 保留字4. 注释5. 行与缩进6. 多行语句7. import 与 from...import8. 命令行参数 Python快速上手&#xff08;一&#xff09; Python3 基础语法 1. 编码 Python 3 默认使用 UTF-8 编…

sql(ctfhub)

一.整数型注入 输入1 输入2 输入2-1&#xff0c;回显为1的结果&#xff0c;说明是数字型&#xff0c;只有数字型才可加减 判断字段数为2 查询数据库 查表 查列 显示flag内容 二.字符型注入 输入1 输入2 输入2-1&#xff0c;说明为字符型&#xff0c;不是数字型 判断闭合方式为…

【数据分析面试】27. 计算广告评论比例 (SQL)

题目: 计算广告评论比例 假设你有一个ads表&#xff0c;包含ID和广告名称&#xff0c;比如“劳动节衬衫促销”。feed_comments表保存了不同用户在常规信息流中对广告的评论。moments_comments表保存了不同用户在moments中对广告的评论。 编写一个查询&#xff0c;获取广告在f…

问题总结笔记

1.向量旋转 问题&#xff1a; 将一个向量旋转90 方法&#xff1a;旋转矩阵 FVector FrontDir EndMousePoint - Point; FrontDir.Normalize(); FVector Left FVector(-FrontDir.Y, FrontDir.X, 0); Verties.Add(Point Left * (WallWedith / 2)); Verties.Add(FVector(Vertie…

BFS 专题 ——FloodFill算法:733.图像渲染

文章目录 前言FloodFill算法简介题目描述算法原理代码实现——BFSCJava 前言 大家好啊&#xff0c;今天就正式开始我们的BFS专题了&#xff0c;觉得有用的朋友给个三连呗。 FloodFill算法简介 中文&#xff1a;洪水灌溉 举个例子&#xff0c;正数为凸起的山峰&#xff0c;负…

攻防世界---misc---easycap

1.下载附件是一个流量包&#xff0c;拿到wireshark中分析 2.查看分级协议 3.过滤data 4.追踪tcp流 5.得到flag

python-基础(5)-字典

python专栏地址 上一篇: python-基础(4)-list 字典 本节主要介绍 字典初始字典的操作 一、字典简单了解 所谓字典&#xff0c;就像我们常用的字典一样&#xff0c;输入一个页码&#xff0c;就到达一页。它有两种方式创建&#xff1a; 直接写name{}namedict() gufeng {&quo…

OpenCV与AI深度学习 | OpenCV如何读取仪表中的指针刻度

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;OpenCV如何读取仪表中的指针刻度 最近遇到一个问题&#xff0c;如何读取仪表中的指针指向的刻度。 解决方法有多种&#xff0c;比如&#xff…

JAVA 基础知识总结

进制转换 十进制转十六进制&#xff1a;Integer.toHexString(int i) 十进制转八进制&#xff1a;Integer.toOctalString(int i) 十进制转二进制&#xff1a;Integer.toBinaryString(int i) 十六进制转十进制&#xff1a;Integer.valueOf("FFFF",16).toString() 八进…