C++-模板与容器

1、模板

模板可以让类或者函数支持一种通用类型,这种通用类型在实际运行过程中可以使用任何数据类型。因此程序员可以写出一些与类型无关的代码。这种编程方式也叫“泛型编程”。

通常有两种形式:

  • 函数模板
  • 类模板

1.1 函数模板

//模板类型声明
template<class T>//T 模板类型

是让一个函数支持模板编程,可以使函数支持通用数据类型。

#include <iostream>
#include <string.h>
using namespace std;
// 模板函数
template<class T>//T 模板类型
add(T a,T b)
{
   return a+b;
}
int main()
{
    cout << add(1,2) << endl; // 3
    string s1 = "hello";
    string s2 = "world";
    cout << add(s1,s2) << endl; // helloworld
    cout << add(2.3,23.12) << endl;
//  cout << add(1,23.3) << endl; 
//编译器自动识别数据类型
//错误,无法推导,局限性:只能用同一种类型
//错误,两个指针无法相加,如果想要实现这个功能,想要将+运算符重载
//cout << add("hello","world") << endl;
    return 0;
}

1.2 类模板

使一个类支持模板编程,可以使类支持通用数据类型。

作用域:只有一个花括号大小

#include <iostream>
#include <string.h>
using namespace std;
// 模板函数
//template<typename T>
//T add(T a,T b)
//{
//   return a+b;
//}
template<class T>    // 可以class 也可以typename
class Test
{
private:
    T val;
public:
    Test(T v)
    {
        val = v;
    }
    T get_val()
    {
        return val;
    }
    void set_val(T v)
    {
        val = v;
    }
};
int main()
{
    // 类模板需要执行模板类型,通过<>。只要在之后的程序中看到<>,肯定是个模板类
    Test<int> t1(20);
    cout << t1.get_val() << endl;
    t1.set_val(10);
    cout << t1.get_val() << endl;
    t1.set_val(2.34);
//    cout << t1.get_val() << endl; // 数据窄化 输出2
    Test<double> t2(2.14); // 指定类模板为double
    cout << t2.get_val() << endl;
    t2.set_val(3);
    cout << t2.get_val() << endl;
    return 0;
}

类内定义,类外声明

上面的写法可以改为类内声明类外定义的形式:

#include <iostream>
#include <string.h>
using namespace std;
template<class T>    // 可以class 也可以typename
class Test
{
private:
    T val;
public:
    Test(T v)
    {
        val = v;
    }
    T get_val();//类内定义 类外声明
    void set_val(T v);
};

template<class T>
Test<T>::get_val()//类内定义 类外声明
{
    return val;
}

template<class T>
//返回值类型 模板类型作用域 函数名(传参)
void Test<T>::set_val(T v)
{
    val = v;
}

int main()
{
    Test<int> t1(20);
    cout << t1.get_val() << endl;
    t1.set_val(10);
    cout << t1.get_val() << endl;
    t1.set_val(2.34);
//    cout << t1.get_val() << endl; // 数据窄化输出2
    Test<double> t2(2.14);
    cout << t2.get_val() << endl;
    t2.set_val(3);
    cout << t2.get_val() << endl;
    return 0;
}


2、容器

2.1 标准模板库STL

标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。虽然说它主要出现在C++中,但是它在被引入C++之前,该技术就已经存在很长时间了。

STL的代码从广义上讲分为三部分,algorithm(算法)、container(容器)、iterator(迭代器)。几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用的机会。

2.2 概念

容器是用来存储数据的集合,数据元素可以是任何类型(因为是使用模板实现的)

容器类的使用,都要引入对应的头文件。

2.3 顺序容器

顺序容器中每个元素均有固定的位置并呈线性排布。除非使用删除或者是插入操作改变元素的位置。

2.3.1 array数组

array是C++11新增的容器类型,与传统数组相比更加安全,易于使用。array数组是定长的。没法方便的伸缩。array创建数组必须是定长的,且不能用变量定长。

QMAKE_CXXFLAGS += -std=c++11

array数组常用函数

#include <array> // 头文件
array<int,5> arr = {1,2,3}; // 后面两位补零

#include <iostream>
#include <array> // 头文件
using namespace std;
int main()
{
    // 创建一个长度为5的int数组
    array<int,5> arr = {1,2,3}; // 后面两位补零
    cout << arr[0] << endl; // 1
    cout << arr[4] << endl; // 0
    cout << arr.at(2) << endl; // 3 推荐使用at
    arr[3] = 200;
    // for
    for(int i = 0; i < arr.size(); ++i)
    {
        cout << arr.at(i) << " ";
    }
    cout << endl;
    // for each
    for(int i:arr)
    {
        cout << i << " ";
    }
    cout << endl;
    //迭代器遍历,后面讲
    // TODO
    return 0;
}

2.3.2 vector 向量

vector向量内部是由数组实现的,比较适合进行随机的存取操作,不擅长插入删除操作。

不是定长,方便伸缩。(大量数据存取时且不经常插入删除)

vector向量常用函数

#include <vector> // 头文件
vector<int> vec(50);//创建一个大小为5类型为int,默认值为0的vector向量数组
vec.push_back(222);//在最后面追加新元素
vec.insert(vec.begin()+2,333);//begin()指向第一个元素位置
vec.pop_back();  // 删除最后一个元素
vec.erase(vec.end()-2);//end()指向最后一个元素后面,删除了倒数第二个元素
vec.empty()// 判断是否为空,0非空,1空
vec.clear();// 清空

#include <iostream>
#include <vector> // 头文件
using namespace std;
int main()
{
//    vector<int> vec(5,0);//创建一个大小为5类型为int,默认值为0的vector向量数组
//    cout << vec.size() << endl;
//    for(int i = 0; i < vec.size(); ++i)
//    {
//        cout << vec[i] << endl;
//    }
    vector<int> vec = {1,2,3};
    // 增
    vec.push_back(222);//在最后面追加新元素
    for(int i :vec)
    {
        cout << i <<" ";
    }
    cout << endl;
    cout<<"--------------------"<<endl;
    cout <<"向量大小:"<< vec.size() << endl;

    // 插入操作,定向插入
    // begin()可以返回指向第一个元素的迭代器指针,+2是在第三个位置上插入333
    vec.insert(vec.begin()+2,333);//begin()指向第一个元素位置
    cout<<"定向插入:"<<endl;
    for(int i :vec)
    {
        cout << i <<" ";
    }
    cout << endl;
    cout<<"--------------------"<<endl;
    // 删
    // 删除最后一个元素
    cout<<"删除最后一个元素:"<<endl;
    vec.pop_back();
    for(int i :vec)
    {
        cout << i <<" ";
    }
    cout << endl;
    cout<<"--------------------"<<endl;
    // 删除了第二个元素
    cout<<"删除了第二个元素:"<<endl;
    vec.erase(vec.begin()+1);
    for(int i :vec)
    {
        cout << i <<" ";
    }
    cout << endl;
    cout<<"--------------------"<<endl;
    // 删除了倒数第二个元素
    cout<<"删除了倒数第二个元素:"<<endl;
    vec.erase(vec.end()-2);//end()指向最后一个元素后面
    for(int i :vec)
    {
        cout << i <<" ";
    }
    cout << endl;
    cout<<"--------------------"<<endl;
    // 改
    cout<<"改:"<<endl;
    vec[1] = 666;
    vec.at(0) = 888;
    for(int i :vec)
    {
        cout << i <<" ";
    }
    cout << endl;
    cout<<"--------------------"<<endl;
    // 查
    cout << vec[1] << endl;
    for(int i :vec)
    {
        cout << i <<" ";
    }
    cout << endl;
    cout << "---------------------" <<  endl;

    for(int i = 0; i < vec.size(); ++i)
    {
        cout << vec[i] << " ";
    }
    cout <<  endl;

    // 判断是否为空,0非空,1空
    cout << vec.empty() << endl;

    // 清空
    vec.clear();
    cout << vec.empty() << endl;
    // 迭代器遍历先省略

    return 0;
}

2.3.3 list列表

list内部是由双向循环链表实现的。不支持下标。优点:可以高效的删除和插入操作。但不适合随机的存取操作。

list列表常用函数

#include <list> // 头文件
list<string> lis2{"hello","world"};
//创建了一个长度为2的列表,第一个元素就是hello,第二个world
list<string> lis(5,"hello");
// 创建一个长度为5的列表,每个元素都是“hello”
lis.push_back("world"); // 向后追加一个单元素
lis.push_front("hahaha");   // 向前追加一个单元素
lis.insert(++lis.begin(),"2222"); // 在第二个位置上插入“2222”,lis.begin()只能自增,不能加数值
lis.pop_back(); // 删最后一个元素
lis.pop_front();    // 删除第一个元素
lis.push_back("world"); // 向后追加一个单元素
list<string>::iterator iter = lis.begin();// 保存迭代器指针
advance(iter,1); // 移动迭代器指针

#include <iostream>
#include <list> // 头文件
using namespace std;
int main()
{
    // 创建了一个默认无数值的list
    list<string> lis1;
    //创建了一个长度为2的列表,第一个元素就是hello,第二个world
    list<string> lis2{"hello","world"};
    for(string s:lis2)
    {
        cout << s << " ";
    }
    cout <<endl;

    // 创建一个长度为5的列表,每个元素都是“hello”
    list<string> lis(5,"hello");
    cout<<"创建一个长度为5的列表,每个元素都是“hello”"<<endl;
    for(string s:lis)
    {
        cout << s << " ";
    }
    cout<<endl;
    cout<<"___________________"<<endl;

    // 增
    lis.push_back("world"); // 向后追加一个单元素
    cout<<"向后追加一个单元素"<<endl;
    for(string s:lis)
    {
        cout << s << " ";
    }
    cout<<endl;
    cout<<"___________________"<<endl;

    lis.push_front("hahaha");   // 向前追加一个单元素
    cout<<"向前追加一个单元素"<<endl;
    for(string s:lis)
    {
        cout << s << " ";
    }
    cout<<endl;
    cout<<"___________________"<<endl;

    lis.insert(++lis.begin(),"2222"); // 在第二个位置上插入“2222”,lis.begin()只能自增,不能加数值
    cout<<"在第二个位置上插入“2222”"<<endl;
    for(string s:lis)
    {
        cout << s << " ";
    }
    cout<<endl;
    cout<<"___________________"<<endl;

    // 删
    lis.pop_back(); // 删最后一个元素
    cout<<"删最后一个元素"<<endl;
    for(string s:lis)
    {
        cout << s << " ";
    }
    cout<<endl;
    cout<<"___________________"<<endl;

    lis.pop_front();    // 删除第一个元素
    cout<<"删除第一个元素"<<endl;
    for(string s:lis)
    {
        cout << s << " ";
    }
    cout<<endl;
    cout<<"___________________"<<endl;

    lis.push_back("world"); // 向后追加一个单元素
    cout<<"删除第一个元素"<<endl;
    for(string s:lis)
    {
        cout << s << " ";
    }
    cout<<endl;
    cout<<"___________________"<<endl;

    // 保存迭代器指针
    list<string>::iterator iter = lis.begin();
    advance(iter,1); // 移动迭代器指针
    lis.insert(iter,"3333");  // 插入3333
    cout<<"通过移动迭代器指针定向插入,插入3333"<<endl;
    for(string s:lis)
    {
        cout << s << " ";
    }
    cout<<endl;
    cout<<"___________________"<<endl;

    // 删除最后一个元素
    iter = lis.end();
    iter--;
    lis.erase(iter);//删除iter指针指向的元素
    cout<<"通过移动迭代器指针定向删除"<<endl;
    for(string s:lis)
    {
        cout << s << " ";
    }
    cout<<endl;
    cout<<"___________________"<<endl;

    // 返回第一个元素的引用
    cout << "打印第一个元素* = " << lis.front() << endl;
    // 返回最后一个元素
    cout << "打印最后一个元素* = " << lis.back() << endl;

    // 改
    iter = lis.end();
    advance(iter,2);//将迭代器指针移动到第二个位置
    *iter = "200";
    cout<<"通过移动迭代器指针定向修改元素"<<endl;
    for(string s:lis)
    {
        cout << s << " ";
    }
    cout<<endl;
    cout<<"___________________"<<endl;
    // 查
    cout<<"迭代器指针查看"<<endl;
    cout << *iter << endl;
    for(string s:lis)
    {
        cout << s << " ";
    }
    cout<<endl;
    cout<<"___________________"<<endl;

    // 迭代器遍历
    cout << lis.size() << endl;
    // 清空
    lis.clear();
    cout << lis.size() << endl;
    return 0;
}

2.3.4 deque队列

deque几乎支持所有vector的API。性能位于vector与list二者之间。最擅长两端存取的顺序容器。

#include <iostream>
#include <deque> // 头文件

using namespace std;

int main()
{
//    deque<int> deq(5);
//    cout << deq.size() << endl;
//    for(int i = 0; i < deq.size(); ++i)
//    {
//        cout << deq[i] << endl;
//    }
    deque<int> deq = {1,2,3};
    // 增
    deq.push_back(222);
    cout << deq.size() << endl;
    // 插入操作
    // begin()可以返回指向第一个元素的迭代器指针,+2是在第三个位置上插入333
    deq.insert(deq.begin()+2,333);

    // 删
    // 删除最后一个元素
    deq.pop_back();

    // 删除了第二个元素
    deq.erase(deq.begin()+1);

    // 删除了倒数第二个元素
    deq.erase(deq.end()-2);

    // 改
    deq[1] = 666;
    deq.at(0) = 888;

    // 查
    cout << deq[1] << endl;
    for(int i :deq)
    {
        cout << i <<" ";
    }
    cout << endl;
    cout << "---------------------" <<  endl;

    for(int i = 0; i < deq.size(); ++i)
    {
        cout << deq[i] << " ";
    }
    cout <<  endl;

    // 判断是否为空,0非空,1空
    cout << deq.empty() << endl;

    // 清空
    deq.clear();
    cout << deq.empty() << endl;
    // 迭代器遍历先省略

    return 0;
}

2.4 关联容器

关联容器的各个元素之间没有严格顺序,虽然内部具有排序特点。但是在使用时没有任何顺序相关的接口。底层是由树构成,(红黑树)

最常见的关联容器就是map-键值对映射

对于map而言,键具有唯一性,键通常使用字符串类型,值任何类型。通过键找到对应的值。

关联容器常用函数

#include <map> // 头文件
map<string,int> ma;//创建一个value为int类型的关联容器
map<string,int> ma1 = {{"年龄",99},{"身高",250}};
ma.insert(pair<string,int>("体重",70));   // 插入元
if(ma.find("身高") == ma.end())
    {
        cout << "没有身高元素" << endl;
    }
int re = ma.erase("身高"); // 删除元素,返回值1成功,0失败

#include <iostream>
#include <map> // 头文件

using namespace std;

int main()
{
    // map创建初始化 C++11支持
    map<string,int> ma1 = {{"年龄",99},{"身高",250}};
    cout << ma1.size() << endl; // 2

    map<string,int> ma;//创建一个value为int类型的关联容器
    cout << ma.size() << endl;//0:容器大小

    // 增
    cout << "增操作:"<< endl;
    ma["身高"] = 180;
    ma.insert(pair<string,int>("体重",70));   // 插入元素
    cout <<"身高"<< ma["身高"] << endl;
    cout <<"体重"<<ma["体重"] << endl;
    cout << "--------------------" << endl;
    // 改
    cout << "改操作:"<< endl;
    ma["身高"] = 165;
    cout << "身高"<<ma["身高"] << endl;
    cout << "--------------------" << endl;
    // 查
    cout << "查操作:" << endl;
    cout << "身高"<<ma["身高"] << endl;
    if(ma.find("身高") == ma.end())
    {
        cout << "没有身高元素" << endl;
    }
    else
    {
        cout << "身高"<<ma["身高"] << endl;
    }
    cout << "--------------------" << endl;
    // 删
    cout << "删除操作前 "<<ma.size() << endl;
    cout << "删除操作:" << endl;
    int re = ma.erase("身高"); // 删除元素,返回值1成功,0失败
    cout << "身高删除返回值:" << re << endl;
    if(ma.find("身高") == ma.end())
    {
        cout << "没有身高元素" << endl;
    }
    else
    {
        cout << "身高"<<ma["身高"] << endl;
    }
    cout <<"删除操作后 "<< ma.size() << endl;
    cout << "--------------------" << endl;
    //清空操作
    cout << "清空操作" << endl;
    ma.clear();
    cout << ma.size() << endl;
    cout << "--------------------" << endl;
    return 0;
}

2.5 迭代器

迭代器是一个特殊的指针,主要用于容器的元素读写以及遍历。

如果迭代器不进行修改,建议使用只读迭代器,const_iterator,反之使用iterator.

#include <array>
#include <vector>
#include <list>
#include <deque>
#include <map> // 头文件

// 迭代器遍历 string
for(string::const_iterator iter = s.begin();iter != s.end(); ++iter)
// 迭代器遍历array
for(array<int,5>::const_iterator iter = arr.begin();iter != arr.end();iter++)
// vector 迭代器遍历
for(vector<string>::const_iterator iter = vec.begin();iter != vec.end();iter++)
// 迭代器遍历list
for(list<string>::const_iterator iter = lis.begin();iter != lis.end();++iter)
// 迭代器遍历deque
for(deque<string>::const_iterator iter = de.begin();iter != de.end();iter++)
// 迭代器遍历map
for(map<string,int>::const_iterator iter = ma.begin();iter != ma.end(); iter++)
{
    // first 是键 second 是值
    cout << iter->first << " " << iter->second << endl;
}

#include <iostream>
#include <array>
#include <vector>
#include <list>
#include <deque>
#include <map> // 头文件

using namespace std;

int main()
{
    string s = "abdcdfg";
    // 迭代器遍历 string
    cout<<"迭代器遍历 string:"<<endl;
    for(string::const_iterator iter = s.begin();
        iter != s.end(); ++iter)
    {
        cout << *iter << " ";
    }
    cout << endl;
    cout << "--------------" << endl;

    // 迭代器遍历array
    cout<<"迭代器遍历array:"<<endl;
    array<int,5> arr = {23,2,5,87,2};
    for(array<int,5>::const_iterator iter = arr.begin();
        iter != arr.end();iter++)
    {
         cout << *iter << " ";
    }
    cout << endl;
    cout << "--------------" << endl;

    // vector 迭代器遍历
    cout<<"vector 迭代器遍历:"<<endl;
    vector<string> vec(6,"hello");
    for(vector<string>::const_iterator iter = vec.begin();
        iter != vec.end();iter++)
    {
        cout << *iter << " ";
    }

    cout << endl;
    cout << "--------------" << endl;

    // 迭代器遍历list
    cout<<"迭代器遍历list:"<<endl;
    list<string> lis(6,"world");
    for(list<string>::const_iterator iter = lis.begin();
        iter != lis.end();++iter)
    {
        cout << *iter << " ";
    }

    cout << endl;
    cout << "--------------" << endl;

    // 迭代器遍历deque
    cout<<"迭代器遍历deque:"<<endl;
    deque<string> de(6,"nihao");
    for(deque<string>::const_iterator iter = de.begin();
        iter != de.end();iter++)
    {
        cout << *iter << " ";
    }

    cout << endl;
    cout << "--------------" << endl;

    // 迭代器遍历map
    cout<<"迭代器遍历map:"<<endl;
    map<string,int> ma;
    ma["年龄"] = 23;
    ma["身高"] = 180;
    ma["体重"] = 65;

    for(map<string,int>::const_iterator iter = ma.begin();
        iter != ma.end(); iter++)
    {
        // first 是键 second 是值
        cout << iter->first << " " << iter->second << endl;
    }

    return 0;
}



练习:

写一个函数show_array,要求传入两个参数。

void show_array(T t,int len)

第一个参数为数组默认值,第二个参数为数组的长度。

此函数的功能为创建一个长度为len类型是T,默认值为t的数组并输出。

尽量不用使用c语言的数组。

#include <iostream>

#include <vector>
using namespace std;
template<class T>
void show_array(T t,int len)
{
    vector<T> vec(len,t);
    for(T i:vec)
    {
        cout << i << " ";
    }

}

int main()
{
    show_array("a",5);
    return 0;
}


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

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

相关文章

WSL使用Ubuntu 20.04版本运行py-bottom-up-attention的记录,及其可能错误的解决方法

文章目录 1. 切换linux的镜像2. 安装gcc3. 查看显卡驱动4. 安装gcc版本5. wsl安装cuda 10.16. 新建虚拟环境8. 安装依赖包9. 运行代码错误运行的所有历史命令如下 WSL使用Ubuntu 20.04版本运行py-bottom-up-attention的记录&#xff0c;及其可能错误的解决方法 github代码地址…

【产品应用】一体化伺服电机在管道检测机器人中的应用

一体化伺服电机在管道检测机器人的应用正日益受到关注。管道检测机器人是一种能够在管道内部进行检测和维护的智能化设备&#xff0c;它可以检测管道的内部结构、泄漏、腐蚀等问题&#xff0c;以确保管道的安全和稳定运行。而一体化伺服电机作为机器人的动力源&#xff0c;对于…

java基于SSM的二手交易平台设计与开发论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本二手交易平台就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在短时间内处理完毕庞大的数据信息&am…

【OpenMP】 2.1 简单示例

1、C中的OMP显示构造 OpenMP在C/C中通常以编译指令的方式进行使用&#xff0c;一个指令和一个结构化块组成构造。 #pragma omp parallel [clause[[,]clause]... ]#pragma omp parallel private(x) {//并行代码 } 示例代码: #include <iostream> #include <omp.h&g…

复试 || 就业day05(2024.01.08)项目一

文章目录 前言代码模拟梯度下降构建函数与导函数函数的可视化求这个方程的最小值&#xff08;直接求导&#xff09;求方程最小值&#xff08;不令方程导为0&#xff09;【梯度下降】eta0.1eta 0.2eta 50eta 0.01画出eta0.1时的梯度下降x的变化过程 总结 前言 &#x1f4ab;你…

【EI会议征稿通知】第六届信息科学、电气与自动化工程国际学术会议(ISEAE 2024)

第六届信息科学、电气与自动化工程国际学术会议&#xff08;ISEAE 2024&#xff09; 2024 6th International Conference on Information Science, Electrical and Automation Engineering 第六届信息科学、电气与自动化工程国际学术会议&#xff08;ISEAE 2024&#xff09;定…

在Windows上使用VScode阅读kernel源码

有一说一&#xff0c;在Windows上使用Source Inside阅读kernel源码真的很舒服&#xff0c;但是有时候带着轻薄本出去&#xff0c;又不想往轻薄本上安装很多的软件&#xff0c;就使用VS code临时阅读kernel源码。如果不能进行跳转&#xff0c;阅读kernel源码就很难受&#xff0c…

使用使用maven后jstl标签库无法使用

创建maven项目后配置了jstl标签库的依赖&#xff0c;但是一直不行&#xff0c;jsp页面还是原样给我输出&#xff0c;然后去网上找了许多办法&#xff0c;类似于配置文件之类的&#xff0c;结果发现对我并没有什么用&#xff0c;还是原样输出 然后就各种查找&#xff0c;发现了一…

安卓上使用免费的地图OpenStreetMap

前一段使用了微信的地图&#xff0c;非常的好用。但是存在的问题是海外无法使用&#xff0c;出国就不能用了&#xff1b; 其实国内三家&#xff1a;百度&#xff0c;高德&#xff0c;微信都是一样的问题&#xff0c;当涉及到商业使用的时候需要付费&#xff1b; 国外除了谷歌…

华为这块单板是姐交付的

写在前面&#xff1a;“所以表不忘初心&#xff0c;而必果本愿也。”回看这一路走来&#xff0c;无论遇到多大的困难、压力和焦虑&#xff0c;我们只有迎难而上&#xff0c;勇往直前&#xff0c;不断学习和成长&#xff0c;才能时刻保持对工作的热情和迎接挑战的勇气。” 转角…

Vue入门二(列表渲染|数据的双向绑定|事件处理)

文章目录 一、列表渲染小案例补充es6对象写法v-for可以循环的类型补充js可循环类型key值的解释 二、数据的双向绑定三、事件处理基本使用过滤案例事件修饰符 一、列表渲染 小案例 <!DOCTYPE html><html lang"en"><head><meta charset"UTF…

openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败

文章目录 openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败190.1 服务启动失败190.1.1 问题现象190.1.2 原因分析190.1.3 处理办法 openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败 190.1 服务启动失败 190.1.1 问题现…

Redis(三)持久化

文章目录 RDB&#xff08;Redis Database&#xff09;自动触发保存频率修改dump文件保存路径修改文件保存名称dump恢复 手动触发save![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a56fdff44aee4efa96c2ce3615b69dc1.png)bgsave 优劣优点缺点 检查修复dump文件会触…

(生物信息学)R语言绘图初-中-高级——3-10分文章必备——点阵图(初级)

生物信息学文章的发表要求除了思路和热点以外,图片绘制是否精美也是十分重要的,本专栏为(生物信息学)R语言绘图初-中-高级——3-10分文章必备,主要通过大量文献,总结3-10分文章中高频出现的各种图片,并给大家提供图片复现的R语言代码,及图片识读。 本专栏将向大家介绍…

数据库原理与应用期末复习试卷1

数据库原理与应用期末复习试卷1 一.单项选择题 数据库系统是采用了数据库技术的计算机系统&#xff0c;由系统数据库&#xff0c;数据库管理系统&#xff0c;应用系统和&#xff08;C&#xff09;组成。 ​ A.系统分析员 B.程序员 C.数据库管理员 D.操作员 数据库系统的体系…

基于YOLOv7算法的高精度实时19类动物目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时19类动物目标检测系统可用于日常生活中检测与定位19类动物目标&#xff08;水牛、 斑马、 大象、 水豚、 海龟、 猫、 奶牛、 鹿、 狗、 火烈鸟、 长颈鹿、 捷豹、 袋鼠、 狮子、 鹦鹉、 企鹅、 犀牛、 羊和老虎&#xff09;&#x…

基于WIFI指纹的室内定位算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1WIFI指纹定位原理 4.2 指纹数据库建立 4.3定位 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .....................................…

动态规划(整数拆分、不同的二叉搜索树)

343. 整数拆分 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: 10 输出: 36 解释: 10 3 3 4, 3 3 4 36。 说明: 你…

JavaScript基础(25)_dom查询练习(二)

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title>dom查询练习二</title><link rel"stylesheet" href"../browser_default_style/reset.css"><style>form {margi…

阿里与上交大提出 LLM 长文本计算新解法:可处理文本长达 1900k 字节

在实际应用大模型的过程中&#xff0c;尤其是处理长文本的上下文信息时&#xff0c;如何高效灵活地调度计算资源成为一个学术界与工业界共同关注的问题。 大语言模型所能容纳的上下文长度直接影响了诸如 ChatGPT 等高级应用与用户交互体验的优劣程度&#xff0c;这给云环境下的…