网站建设分为/网络营销常用的工具和方法
STL
- STL(Standard Template Library,标准模板库)
- STL从广义上分为:
容器
(container)算法
(algorithm)迭代器
(iterator)
容器
和算法
之间通过迭代器
进行无缝连接。- STL几乎所有的代码都采用模板类或者模板函数
1、STL六大组件
STL大体分为六大组件,分别是:容器
、算法
、迭代器
、仿函数
、适配器(配接器)
、空间配置器
- 容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据
- 算法:各种常用的算法,如sort、find、copy、for_each等
- 迭代器:扮演了容器与算法之间的胶合剂
- 仿函数:行为类似函数,可作为算法的某种策略
- 适配器:一种用来修饰容器或仿函数或迭代器接口的东西
- 空间适配器:负责空间的配置与管理
2、STL中容器、算法、迭代器
容器:放置东西用的。
STL容器就是将运用最广泛的
一些数据结构
实现出来
常用的数据结构:数组,链表,树,栈,队列,集合,映射表等。
这些容器分为 序列式容器
和关联式容器
两种:
- 序列式容器:
- 强调值的排序,序列式容器中的每个元素均有固定的位置。
- 关联式容器:
- 二叉树结构,各元素之间没有严格的物理上的顺序关系
算法:解决问题的解法
有限的步骤,解决逻辑或数学上的问题,这就叫做算法(algorithm)
算法分为:质变算法
和非质变算法
- 质变算法:
- 是指运算过程中会更改区间内的元素的内容。
- 例如:
拷贝
,替换
,删除等等
- 非质变算法:
- 是指运算过程中不会更改区间内的元素内容。
- 例如:
查找
、计数
、遍历
、寻找极值
等等
迭代器:容器和算法之间的粘合剂
提供一种方法,使能够依次按照顺序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方法。
每个容器都有自己专属的迭代器
迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针。
迭代器种类:
种类 | 功能 | 支持运算 |
---|---|---|
输入迭代器 | 对数据的只读访问 | 只读,支持++、==、!= |
输出迭代器 | 对数据的只写访问 | 只写,支持++ |
前向迭代器 | 读写操作,并能向前推进迭代器 | 读写,支持++、==、!= |
双向迭代器 | 读写操作,并能向前和向后操作 | 读写,支持++、– |
随机访问迭代器 | 读写操作,可以以跳跃的方式访问任意数据,功能最强的迭代器 | 读写,支持++、–、[n]、-n、<、<=、>、>= |
常用的容器中迭代器种类分为双向迭代器和随机访问迭代器
3、容器算法迭代器初识
3.1、 vector存放内置数据类型
容器:vector
算法:for_each
迭代器: vector::iterator
*it 的数据类型只需要看vector 的尖括号里面内容 例如这里面就是int型
示例:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
//vector 容器存放内置的数据类型void myPrint(int val) {cout << val << endl;
}void test01() {//创建容器,数组vector<int> v;//插入数据-尾插v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);v.push_back(50);//通过迭代器访问容器中的数据vector<int>::iterator itBegin = v.begin(); //起始迭代器,指向容器中第一个元素vector<int>::iterator itEnd = v.end(); //结束迭代器,指向容器中最后一个元素的下一个元素//第一种遍历方式while (itBegin!=itEnd){cout << *itBegin << endl;itBegin++;}//第二种方式(常用)cout << "第二种" << endl;for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << endl;}//第三种方式(算法)cout << "第三种" << endl;//底层原理,就是利用一个for循环输出,输出方式是调用我们给定的函数(回调函数)for_each(v.begin(), v.end(), myPrint);
}
3.2、Vector存放自定义数据类型
示例:
#include<iostream>
#include<string>
#include<vector>
using namespace std;//vector容器中存放自定义数据类型
class Person {
public:Person(string name, int age) {this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;
};void test01() {vector<Person> v;Person p1("a",10);Person p2("b",20);Person p3("c",30);Person p4("d",40);Person p5("e",50);//添加数据v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);//遍历数据for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {cout << "姓名:" << (*it).m_Name <<" 年龄:"<<(*it).m_Age << endl;cout << "姓名:" << it->m_Name <<" 年龄:"<<it->m_Age << endl;}
}//存放自定义数据类型 指针
void test02() {vector<Person*> v;Person p1("a", 10);Person p2("b", 20);Person p3("c", 30);Person p4("d", 40);Person p5("e", 50);//添加数据v.push_back(&p1);v.push_back(&p2);v.push_back(&p3);v.push_back(&p4);v.push_back(&p5);for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++) {cout << "姓名:" << (*it)->m_Name << "年龄:" << (*it)->m_Age << endl;}
}
3.3、Vector容器嵌套容器
#include<iostream>
using namespace std;
#include<vector>//容器嵌套容器
void test01() {vector<vector<int>> v;//创建小容器vector<int> v1;vector<int> v2;vector<int> v3;vector<int> v4;//向小容器添加数据for (int i = 0; i < 4; i++){v1.push_back(i + 1);v2.push_back(i + 1);v3.push_back(i + 1);v4.push_back(i + 1);}//将小容器插入到大容器中v.push_back(v1);v.push_back(v2);v.push_back(v3);v.push_back(v4);for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++) {//(*it)还是个容器还需要遍历for(vector<int>::iterator vit = (*it).begin();vit!=(*it).end();vit++){cout << *vit <<" ";}cout << endl;}
}
4、常用容器
4.1、string容器
4.1.1、string基本概念
本质
:
- string是C++风格的字符串,而string本质上是一个类
string和char * 区别:
- char * 是一个指针
- string是一个类,类内部封装了char *,管理这个字符串,是一个char *型的容器
特点:
string类内部封装了许多成员方法
例如:查找find,拷贝copy,删除delete ,替换replace,插入insert
string管理char*所分配的内存,不用担心赋值越界和取值越界等,由类内部进行负责
4.1.2、string构造函数
构造函数原型
- string(); //创建一个空的字符串 例如:string str;
- string(const char *s) //使用字符串s初始化
- string(const string &str)//使用一个string对象初始化另一个string对象
- string(int n,char c); //使用n个字符c初始化
示例:
#include<iostream>
#include<string>
using namespace std;void test01() {string s1;//默认构造const char* str = "hello world";string s2(str);cout << "s2 = " << s2 << endl;string s3(s2);cout << "s2 = " << s3 << endl;string s4(10, 'a');cout << "s4 = " << s4 << endl;
}
4.1.3、string赋值操作
功能描述:
- 给string字符串进行赋值操作
赋值的函数原型:
- string & operator=(const char * s); //char *类型字符串 赋值给当前的字符串
- string & operator=(const string* s) //把字符串s赋给当前的字符串
- string & operator=(char c) //把字符串值赋给当前的字符串
- string & assign(const char *s) //把字符串s赋给当前的字符串
- string & assign(const char * s,int n) //把字符串s的前N个字符赋给当前的字符串
- string & assign(const string &s); //把字符串S赋给当前字符串
- string & assign(int n ,char c) //用n个字符c赋给当前字符串
void test01() {string str1;str1 = "hello";cout << "str1" << str1 << endl;string str2;str2 = str1;cout << "str2" << str1 << endl;string str3;str3 = 'a';cout << "str3" << str3 << endl;string str4;str4.assign("hello c++");cout << "str4" << str4 << endl;string str5;str5.assign("hello", 3);cout << "str5" << str5 << endl;string str6;str6.assign(str5);cout << "str6" << str6 << endl;string str7;str7.assign(7,'w');cout << "str7" << str7 << endl;}
4.1.4、string字符串拼接
功能描述:
- 实现字符串末尾拼接字符串
函数原型:
- string & operator+=(const char * str); //重载+=操作符
- string & operator+=(const char c); //重载+=操作符
- string & operator+=(const string & str); //重载+=操作符
- string & append(const char *s);//把字符串s连接到当前字符串结尾
- string & append(const char *s,int n);//把字符串s的前n个字符连接到当前字符串结尾
- string & append(const string &s);//同operator+=(const string & str);
- string & append(const string &s,int pos,int n);//从字符串s中从pos开始的n个字符连接到字符串结尾
void test01() {string str1 = "我";str1 += "爱玩游戏";cout << "str1的值:" << str1 << endl;str1 += ':';cout << "str1的值:" << str1 << endl;string str2 = "csgo";str1 += str2;cout << "str1的值:" << str1 << endl;str1.append("、");cout << "str1的值:" << str1 << endl;str1.append("lol,cf", 4);cout << "str1的值:" << str1 << endl;str1.append(str2);cout << "str1的值:" << str1 << endl;str1.append("string字符串拼接", 5, 11);cout << "str1的值:" << str1 << endl;
}
4.2、vector容器
- 作用类似于数组
4.3、deque容器
- 双端数据,可以对头端进行插入删除操作
deque与vector区别
- vector对于头部的插入删除效率低,数据量越大,效率越低
- deque相对而言,对头部的插入删除速度会比vector快
- vector访问元素时速度会比deque快,这和两者的内部实现有关
deque内部工作原理:
deque内部有个中控器,维护每段缓冲区 中的内容,缓冲区中存放真实数据。中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间
4.4、stack容器
- stack是一种
先进后出
(First In Last Out,FILO)的数据结构,它只有一个出口
栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为
4.5、queue容器
概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口
- 队列容器允许从一端新增元素,从另一端移除元素
- 队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为
- 队列中进数据称为 – 入队 push
- 队列中出数据称为 – 出队 pop
4.6、list容器
功能:将数据进行链式存储
链表:(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
链表的组成:链表由一系列节点组成
节点的组成:一个是存放数据元素的数据域,另一个是存储下一个节点地址的指针域
STL中的链表是一个双向循环链表
这里的第一个节点的前一个节点指向最后一个,最后一个的后一个节点指向第一个节点
由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只能支持前进和后移,属于双向迭代器
list的优点:
- 采用动态存储分配,不会造成内存浪费和溢出
- 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
list的缺点:
- 链表灵活,但是空间(指针域)和时间(遍历)额外消耗较大
list一个重要性质,插入或删除一个节点,都不会造成原有的list迭代器的失效,这在vector是不成立的
4.7、set/multiset容器
简介
:所有元素都会在插入时自动被排序
本质
:set/multiset属于关联式容器
,底层结构是用二叉树
实现
set和mulitiset区别
:
- set不允许容器中有重复的元素
- mulitiset允许容器中有重复的元素
4.8、pair对组创建
- 成对出现的数据,利用对组可以返回俩个数据
创建方法:
- pair<type,type> p (vlaue1,vlaue2);
- pair<type,type> p = make_pair(value1,value2)
取值:
- p.first取第一个 p.second 取第二个
4.9、map/multimap容器
简介:
- map中所有元素都是pair
- pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
- 所有的元素都会根据元素的键值自动排序
本质:
- map/multimap属于关联式容器,,底层结构都是二叉树实现。
优点:
- 可以根据key值快速找到value值
map/multimap区别:
- map不允许容器中有重复key值元素
- multimap允许容器中有重复key值元素
5、函数对象
概念:
- 重载函数调用操作符的类,其对象称为
函数对象
函数对象
使用重载的()时,行为类似函数调用,也叫仿函数
本质:
函数对象(仿函数)是一个类,而不是一个函数
5.1、函数对象使用
特点:
-
函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
-
函数对象超出普通函数的概念,函数对象可以有自己的状态
-
函数对象可以作为参数传递
示例:
#include<iostream>
#include<string>
using namespace std;//1、-函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
//2、- 函数对象超出普通函数的概念,函数对象可以有自己的状态
//3、- 函数对象可以作为参数传递class addNum {
public:int operator()(int a, int b) {return a + b;}
};
//1、-函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
void test01() {addNum add;int a = add(10, 20);cout << "add:" << a << endl;
}//2、- 函数对象超出普通函数的概念,函数对象可以有自己的状态
class Myprint {
public:Myprint() {count = 0;}void operator()(string input) {cout << input << endl;count++;}//自己的状态int count;
};void test02() {Myprint myPrint;myPrint("test");myPrint("test");cout << "次数有:" << myPrint.count << endl;
}//3、- 函数对象可以作为参数传递
void doPrint(Myprint& a, string b) {a(b);
}
void test03() {Myprint my;doPrint(my, "hello");
}
5.2、谓词
概念:
- 返回bool类型的仿函数称为谓词
- 如果operator()接受一个参数,那么叫一元谓词
- 如果operator()接受二个参数,那么叫二元谓词
示例:
一元
//找大于5的数字
class findFive {
public:int operator()(int a) {if (a>5){return a;}}
};void test01() {vector<int> v;for (int i = 0; i < 10; i++){v.push_back(i);}vector<int>::iterator v2 = find_if(v.begin(), v.end(), findFive());if (v2 ==v.end()){cout << "no" << endl;}else {cout << "yes" << endl;}
}
二元:
class MyCompare
{
public:bool operator()(int num1, int num2) {return num1 > num2;}
};void test01() {vector<int> v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);sort(v.begin(), v.end(),MyCompare());for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}
5.3、内建函数对象
概念:
- STL内建了一些函数对象
分类:
- 算数仿函数
- 关系仿函数
- 逻辑仿函数
用法:
- 这些仿函数所产生的对象,用法和一般函数完全相同
- 使用内建函数对象,需要引入头文件
- #include
5.1.1、算术仿函数
功能描述:
- 实现四则运算
- 其中negate是一元运算,其他都是二元运算
#include<iostream>
#include<functional>
using namespace std;
//内建函数对象 算术仿函数//negate 一元仿函数 取反仿函数
void test01() {negate<int> n;cout << n(50) << endl;
}//plus 二元仿函数 加法
void test02() {plus<int> p;cout << p(10, 20) << endl;
}
5.1.2、关系仿函数
功能描述:
- 实现关系对比
示例:
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;void test01() {vector<int> v;v.push_back(10);v.push_back(30);v.push_back(20);v.push_back(50);for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;//greater<int>() 内建函数sort(v.begin(), v.end(), greater<int>());for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}
5.1.3、逻辑仿函数
功能:
- 实现逻辑运算
示例:
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;
//逻辑非 logical_notvoid test01() {vector<bool> v;v.push_back(true);v.push_back(false);v.push_back(true);v.push_back(false);for (vector<bool>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;//取反 搬到v2中vector<bool> v2;//提前开辟空间v2.resize(v.size());transform(v.begin(), v.end(), v2.begin(), logical_not<bool>());for (vector<bool>::iterator it = v2.begin(); it != v2.end(); it++) {cout << *it << " ";}cout << endl;
}
6、常用算法
概述:
- 头文件主要由
- - 范围涉及 比较、交换、查找、遍历操作、复制、修改等等
- - 定义了一些模版类,用以声明函数对象
- - 只包括序列上面进行简单数学运算的模板函数
6.1、常用遍历算法
6.1.1、for_each
功能:遍历容器
//提供一个仿函数
class print02 {
public:void operator()(int val) {cout << val << " ";}
};for_each(v2.begin(), v2.end(), print02());
6.1.2、transform
功能:搬运容器到另一个容器
//提供仿函数,可以修改值
class Transform {
public:int operator()(int v) {return v +1000;}
};vector<int> v2;v2.resize(v.size());transform(v.begin(), v.end(), v2.begin(), Transform());
6.2、常用的查找算法
6.2.1、find
功能描述:查找指定元素,找到返回指定元素的迭代器,找不到返回迭代器end()
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;//find//内置数据类型
void test01() {vector<int> v1;for (int i = 0; i < 10; i++){v1.push_back(i);}//for (int i : v1) {// cout << i << endl;//}vector<int>::iterator it = find(v1.begin(), v1.end(), 5);if (it==v1.end()){cout << "没有找到" << endl; }else {cout << "找到了" << endl;}
}//自定义数据类型
class Person {
public:Person(string name, int age) {this->m_Name = name;this->m_Age = age;}bool operator==(const Person &p1) {if (p1.m_Name==this->m_Name&&p1.m_Age==this->m_Age){return true;}else {return false;}}string m_Name;int m_Age;
};
void test02() {vector<Person> v1;Person p1("aa", 10);Person p2("bb", 20);Person p3("cc", 30);Person p4("dd", 40);Person p5("dd", 40);v1.push_back(p1);v1.push_back(p2);v1.push_back(p3);v1.push_back(p4);vector<Person>::iterator it = find(v1.begin(), v1.end(), p5);if (it == v1.end()){cout << "未找到" << endl;}else {cout << "找到了" << endl;}
}
6.2.2、find_if
功能描述:
按照条件查询元素,并返回第一个满足条件的位置的迭代器
6.2.3、adjacent_find
功能描述:
- 查找相邻重复元素
- 返回第一个满足条件的迭代器
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;void test01() {vector<int> v;v.push_back(0);v.push_back(0);v.push_back(1);v.push_back(1);v.push_back(2);v.push_back(0);v.push_back(3);v.push_back(3);vector<int> ::iterator it = adjacent_find(v.begin(), v.end());if (it==v.end()){cout << "没找到" << endl;}else {cout << "找到了" << *it << endl;}}
6.2.4、binary_search
功能描述:
- 查找指定元素是否存在
- 必须有序
- 存在返回true 不存在 false
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;void test01() {vector<int> v;for (int i = 0; i < 10; i++){v.push_back(i);}if (binary_search(v.begin(), v.end(), 10)){cout << "找到了" << endl;}else{cout << "没有" << endl;}
}
6.2.5、count
功能描述:
- 统计元素个数
- 返回int的数据
void test01() {vector<int> v;v.push_back(10);v.push_back(10);v.push_back(30);v.push_back(10);v.push_back(50);int num = count(v.begin(), v.end(), 10);cout << num << endl;
}class Person {
public:Person(string name,int age) {this->m_Name = name;this->m_Age = age;}//必须重载==号才能对比自定义数据类型bool operator==(const Person& a) {if (this->m_Name == a.m_Name &&this->m_Age ==a.m_Age){return true;}else {return false;}}string m_Name;int m_Age;
};void test02() {vector<Person> v2;Person p1("aa", 10);Person p2("aa", 10);Person p3("ba", 20);Person p4("ca", 30);Person p5("aa", 10);v2.push_back(p1);v2.push_back(p2);v2.push_back(p3);v2.push_back(p4);int num = count(v2.begin(), v2.end(), p5);cout << num << endl;
}
6.2.6、count_if
功能描述:
- 按照条件统计元素个数
6.3、排序算法
6.3.1、sort
功能描述:
- 对容器内元素进行排序
- 默认升序
- 降序需要加greater<>()
sort(v.begin(),v.end(),greater<int>())
6.3.2、random_shuffle
功能描述:
- 洗牌 指定范围内的元素随机调整次序
random_shuffle(v.begin(),v.end())//可以模拟真实的随机 加一个随机数种子
#include<ctime>
strand((unsigned)time(NULL));
6.3.4、merge
功能描述:
- 容器元素合并,并存储到另一个容器
- 俩个容器都必须有序
//目标容器
vector<int> vTarget;
vTarget,resize(v1.size()+v2.size())
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),vTarget.begin());
6.3.5、reverse
功能描述:
- 反转指定范围的元素
reverse(v.begin(),v.end());
6.4、拷贝和替换算法
6.4.1、copy
功能描述:
- 容器内指定范围的元素拷贝到另一个容器中
//新容器
vector<int> v2;
v2.resize(v1.size());
copy(v1.begin(),v1.end(),v2.begin());
6.4.2、replace
功能描述:
- 将容器内指定范围的旧元素修改为新元素
replace(v.begin(),v.end(),oldValue,newValue);
6.4.3、replace_if
功能描述:
- 将容器内指定范围满足条件的元素替换为新元素
//_pred规则
class Greater30{
public:bool operator()(int val){return val>=30;}
}
//_pred 指的就是你自定义的规则
replace(v.begin(),v.end(),_pred,newValue);
6.4.4、swap
功能描述:
- 互换俩个容器的元素
- 两个容器必须同等类型
//swap(container c1,container c2);
vector<int> v1;
vector<int> v2;swap(v1,v2);
6.5、常用算数生成算法
头文件:
#include <numeric>
6.5.1、accumulate
功能描述:
- 计算区间内 容器元素累计总和
//accumulate(iterator beg,iterator end,value);
//value 起始的累加值accumulate(v.begin(),v.end(),0);
6.5.2、fill
功能描述:
- 向容器中添加元素
//fill(iterator beg,iterator end,value);
//value 起始的累加值fill(v.begin(),v.end(),100);
6.6、常用集合算法
注意事项:使用方法前,必须保证容器是有序的
6.6.1、set_intersection
功能描述:
- 求两个容器的交集
vector<int> vTarget;
vTarget,resize(v1.size()+v2.size());set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),vTarget.begin());
6.6.2、set_union
功能描述:
- 求两个容器的并集
vector<int> vTarget;
vTarget,resize(v1.size()+v2.size());set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),vTarget.begin());
6.6.3、set_difference
功能描述:
- 求两个容器的差集
vector<int> vTarget;
vTarget,resize(两个容器中较大的容器的大小);set_difference(v1.begin(),v1.end(),v2.begin(),v2.end(),vTarget.begin());
相关文章:

C++ --STL
STL STL(Standard Template Library,标准模板库)STL从广义上分为: 容器(container)算法 (algorithm)迭代器 (iterator) 容器 和 算法之间通过迭代器进行无缝连接。STL几乎所有的代码都采用模板类或者模板函数 1、ST…...

一卷到底,大明哥带你横扫 Netty
上一个死磕 Java 专栏【死磕 NIO】(当然写的不是很好,争取今年将它重写一遍)是**【死磕 Netty】**的铺垫,对于我们 Java 程序员而言,我们在实际开发过程一般都不会直接使用 Java NIO 作为我们的网络编程框架,因为写出一套高质量的…...

Python Opencv实践 - 车辆统计(1)读取视频,移除背景,做预处理
示例中的图像的腐蚀、膨胀和闭运算等需要根据具体视频进行实验得到最佳效果。代码仅供参考。 import cv2 as cv import numpy as np#读取视频文件 video cv.VideoCapture("../../SampleVideos/Traffic.mp4") FPS 10 DELAY int(1000 / FPS) kernel cv.getStructu…...

ROS-6.参数的使用
参数的使用 参数服务结构命令行的使用方式运行小海龟命令介绍查看参数获取参数值设置参数保存参数到文件从文件导入参数 通过程序操作创建节点修改cmake编译运行 参数服务结构 ros中存在参数服务管理服务,管理这所有参数,所有节点剋订阅和发布这些节点 …...

机器视觉在自动驾驶汽车中的应用与挑战
机器视觉在自动驾驶汽车中扮演着至关重要的角色,它使车辆能够感知和理解周围环境,以便自主驾驶。以下是机器视觉在自动驾驶汽车中的应用以及相关挑战: 应用: 障碍物检测与避让: 机器视觉系统可以检测和识别路上的障碍…...

欠拟合、过拟合及优化:岭回归
问题:训练数据训练的很好啊,误差也不大,为什么在测试集上面有问题呢? 当算法在某个数据集当中出现这种情况,可能就出现了过拟合现象。 1、 什么是过拟合与欠拟合 欠拟合 过拟合 分析 第一种情况:因为机器学习到的天鹅特征太少了,导致区分标准太粗糙,不能准确识别出天鹅…...

Mybatis学习笔记注解/xml映射/动态SQL%%%Mybatis教程
介绍 Mybatis 是一款优秀的持久层框架,用于简化 JDBC 的开发 MyBatis中文网 Mybatis 入门 快速入门 步骤 创建 SpringBoot 工程、数据库表 user、实体类 User引入 Mybatis 相关依赖,配置 Mybatis(数据库连接信息)编写 SQL 语…...

Git纯操作版 项目添加和提交、SSH keys添加、远程仓库控制、冲突解决、IDEA连接使用
Git 文章目录 Git项目简单克隆通用操作添加和提交回滚分支变基分支优选 远程项目推送认证抓取、拉取和冲突解决 IEDA类软件连接 最近学原理学的快头秃了,特此想出点不讲原理的纯操作版,不过还是放个图吧 项目简单克隆 git在本人日常中最重要的功能还是…...

使用OpenSSL生成自签证书
什么是OpenSSL OpenSSL是一个开源的软件库和工具套件,用于安全地处理网络数据传输中的加密、解密、安全套接层(SSL)以及传输层安全(TLS)协议等功能。它广泛应用于网站和互联网服务中,以确保数据传输的安全…...

Spring源码解析——Spring事务是怎么通过AOP实现的?
正文 此篇文章需要有SpringAOP基础,知道AOP底层原理可以更好的理解Spring的事务处理。最全面的Java面试网站 自定义标签 对于Spring中事务功能的代码分析,我们首先从配置文件开始人手,在配置文件中有这样一个配置:<tx:annot…...

机器人革命:脑洞大开的前沿机器人技术!
原创 | 文 BFT机器人 01 由生物启发的多模式移动形态机器人 在一个不断运动的世界中,一种新开发的名为M4(多模式移动形态机器人)的机器人展示了在包括滚动、飞行和行走在内的八种不同运动模式之间切换的能力。这款机器人由加州理工学院自主…...

微信小程序动态海报
参考文献: 微信小程序生成分享海报(附带二维码生成) - 简书 需求背景: 微信小程序固定图片,无法自动链接,分享页面内容 解决方案: 拆分海报内容,由以下几个组成 1、用户图像 …...

手写单例模式
一、单例模式的定义 定义: 确保一个类只有一个实例,并提供该实例的全局访问点。 这样做的好处是:有些实例,全局只需要一个就够了,使用单例模式就可以避免一个全局使用的类,频繁的创建与销毁,耗…...

介绍6种解决电脑找不到vcomp140.dll,无法继续执行代码的方法。
在编程和软件开发领域,我们经常会遇到各种错误和问题。其中,找不到vcomp140.dll文件导致无法继续执行代码是一个非常常见的问题。这个问题可能会影响到软件的正常运行,甚至导致整个项目延期。因此,我们需要找到解决方案来解决这个…...

mysql数据物理迁移
文章目录 一、mysql数据物理迁移1.1 物理迁移 一、mysql数据物理迁移 1.1 物理迁移 速度快,需要停机 进入数据库,查看数据存放位置: select datadir; 一般默认存放在/var/lib/mysql 停机数据库,防止有写入数据 systemctl stop …...

构建图像金字塔:探索 OpenCV 的尺度变换技术
构建图像金字塔:探索 OpenCV 的尺度变换技术 引言什么是图像金字塔?为什么需要图像金字塔?构建高斯金字塔构建拉普拉斯金字塔图像金字塔的应用示例:在不同尺度下检测图像中的边缘 结论 引言 在计算机视觉领域,图像金字…...

ios app开发环境搭建
Xcode是Apple iOS的应用市场app store移动应用的开发工具,支持不同设备、不同应用场景的开发,本文主要描述xcode开发工具开发环境的搭建。 如上所示,在macos中,使用app store安装xcode开发工具 如上所示,在macos中&…...

mysql面试题45:读写分离常见方案、哪些中间件可以实现读写分离
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说你知道的读写分离常见方案 读写分离是一种常见的数据库架构方案,旨在分担数据库的读写压力,提高系统的性能和可扩展性。以下是两种常见的…...

【数字IC设计】DC自动添加门控时钟
简介 数字电路的动态功耗主要是由于寄存器翻转带来的,为了降低芯片内部功耗,门控时钟的方案应运而生。作为低功耗设计的一种方法,门控时钟是指在数据无效时将寄存器的时钟关闭,以此来降低动态功耗。 在下图中,展示了…...

前端开发工具vscode
一、下载安装 https://code.visualstudio.com/ 二、安装插件 三、使用 ①、创建一个空目录 ②、利用vscode工具打开该目录 ③、将该目录设置为工作区 在工作区中添加文件,还可以进行浏览器访问(提前安装了Live Server插件) 为工具…...

网络基础2(1)
HTTP 1.应用层协议2.send和recv单独使用不安全3.URL4.urlencode和urldecode5.HTTP协议格式6.HTTP中的常见请求方法POST&&GET7.HTTP的状态码8.HTTP常见Header 🌟🌟hello,各位读者大大们你们好呀🌟🌟 Ƕ…...

系统文件IO、文件描述符fd、重定向、文件系统、动态库和静态库
目录 C文件接口系统文件I/O系统调用和库函数文件描述符0 & 1 & 2FILE和fd的关系文件描述符的分配规则 重定向重定向的本质输出重定向输入重定向追加重定向 dup2函数 FILE理解文件系统了解磁盘的物理结构逻辑抽象文件系统文件系统的图解和解析通过文件系统来理解ls -al通…...

一、K8S第一步搭建
一、初始化操作 1.1、关闭防火墙 systemctl stop firewalld systemctl disable firewalld关闭交换空间 swapoff -a # 临时 sed -ri s/.*swap.*/#&/ /etc/fstab # 永久重启才能生效 根据规划设置主机名 hostnamectl set-hostname <hostname>映射主机 cat >>…...

pwnable-1-fd
pwn的学习周期确实比较长,需要的前置内容也很多,了解到第一题还算比较简单的,那就先来体验一波~顺带附一波网站链接:👉网站链接 题目 WP 最后一行给出了ssh链接方式,那就先连接一波 第一次连接会有第四行的询问&…...

队列的实现(c语言)
队列也是线性表,也是分为两种的:1、顺序队列 2、链队列 顺序队列 #include <stdio.h> #include <stdlib.h>typedef struct {char *base;int front;int erer;int size; }SqQueue;void initSqQueue(SqQueue *queue,int size){queue->base…...

雷电模拟器上使用第一个frida(五)用python实现逆向分析并模拟登陆
上篇通过hook确定了登录代码的位置,参考雷电模拟器上使用第一个frida(四)第一个HOOK之抓包-CSDN博客 接下来逆向分析一下,并用python实现其功能,并模拟登陆。...

基于Linux上MySQL8.*版本的安装-参考官网
本地hadoop环境安装好,并安装好mysql mysql下载地址及选择包 MySQL :: Download MyS的QL Community Server (Archived Versions) mysql安装步骤 下载与上传解压给权限 #mysql安装包上传到/opt下 cd /usr/local/ #解压到此目录 tar -xvf /opt/mysql-8.0.33-linux-glibc2.12-…...

git 项目管理操作
git stash: 保存当前工作进度 git stash save message... : 添加一些注释。 git stash pop : 恢复最新的进度到工作区 git remote prune origin:将本地分支与已删除的远程分支同步 git branch -d <branch-name> :删除分支 git branch -D <branc…...

数据结构--》掌握数据结构中的排序算法
当我们面对海量数据时,如何高效地将其排序是数据结构领域中一个重要的问题。排序算法作为其中的关键部分,扮演着至关重要的角色。 无论你是初学者还是进阶者,本文将为你提供简单易懂、实用可行的知识点,帮助你更好地掌握排序算法在…...

Kubernetes实战(三)-k8s节点设置cpu高于多少就不调度
1 k8s节点设置的概念和原理 k8s是Google开源的容器集群管理系统,用于自动化部署、扩展和管理容器化应用程序。在k8s中,Node是指容器运行的物理或虚拟机器。Node可以是一个物理机或一个虚拟机器,k8s通过其调度器将Pod调度到每个Node上。对于一…...