当前位置: 首页 > news >正文

C++泛型编程指南08 auto decltype

文章目录

    • @[TOC]
      • 第3章:`auto`占位符(C++11~C++17)
        • 3.1 `auto`关键字的重新定义
        • 3.2 类型推导规则
      • 3.3 何时使用`auto`
        • 3.4 返回类型推导
        • 3.5 在Lambda表达式中使用`auto`
        • 3.6 非类型模板参数占位符
      • 总结
      • 第4章 `decltype`说明符(C++11~C++17)
        • 4.1 回顾 `typeof` 和 `typeid`
        • 4.2 使用 `decltype` 说明符
        • 4.3 推导规则
        • 4.4 cv限定符的推导
        • 4.5 `decltype(auto)`
        • 4.6 `decltype(auto)` 作为非类型模板形参占位符
      • 总结
      • 第5章 函数返回类型后置与推导
        • 5.1 使用函数返回类型后置声明函数
        • 5.2 推导函数模板返回类型
      • 总结

第3章:auto占位符(C++11~C++17)

3.1 auto关键字的重新定义

虽然auto关键字自C++98标准以来就已经存在,用于声明自动变量,但C++11为其赋予了新的意义:根据初始化表达式自动推断变量类型,或作为函数返回值类型的占位符。例如:

auto i = 5; // 推断为int
auto str = "hello auto"; // 推断为const char*
auto sum(int a1, int a2) -> int { return a1 + a2; } // 返回类型后置,使用auto作为占位符

重要的是,当编译器无法推导出类型时,使用auto会导致编译失败。

这里有几点需要注意:

  1. 多变量声明:使用单个auto关键字声明多个变量时,编译器会依据最左边的初始化表达式来推导auto的具体类型:

    int n = 5;
    auto *pn = &n, m = 10; // pn: int*, m: int
    

    如果尝试将不同类型的值赋给同一auto声明的不同变量,会导致编译错误:

    int n = 5;
    auto *pn = &n, m = 10.0; // 编译失败,类型不匹配
    
  2. 条件表达式初始化:在使用条件表达式初始化auto变量时,编译器会选择表达能力更强的类型:

    auto i = true ? 5 : 8.0; // i的数据类型为double
    
  3. 成员变量声明限制:尽管C++11允许在声明成员变量时进行初始化,但不允许用auto声明非静态成员变量。然而,在C++11中,可以用const限定符声明静态成员变量,并且在C++17中,即使没有const限定符也可以这样做:

    struct sometype {static const auto i = 5; // C++11static inline auto j = 5; // C++17
    };
    
  4. 函数参数限制:在C++20之前,不能在函数形参列表中使用auto声明形参(但在C++14中,auto可用于lambda表达式的形参):

    void echo(auto str); // C++20之前编译失败
    
3.2 类型推导规则
  1. 忽略cv限定符:对于按值初始化的auto变量,推导类型时会忽略常量和volatile限定符:

    const int i = 5;
    auto j = i; // auto推导为int,而非const int
    
  2. 引用属性被忽略:如果目标对象是引用,auto推导类型时会忽略引用属性:

    int i = 5;
    int &j = i;
    auto m = j; // auto推导为int,而非int&
    
  3. 万能引用:使用auto&&声明变量时,对于左值auto会被推导为引用类型,而对于右值则不会:

    int i = 5;
    auto&& m = i; // auto推导为int&(引用折叠)
    auto&& j = 5; // auto推导为int
    
  4. 数组与函数指针:当目标对象是数组或函数时,auto会被推导为对应的指针类型:

    int i[5];
    auto m = i; // auto推导为int*int sum(int a1, int a2);
    auto j = sum; // auto推导为函数指针类型
    
  5. 列表初始化:结合auto和列表初始化时,有特定的规则需遵守(C++17标准):

    • 使用直接列表初始化时,列表中必须是单元素,否则编译失败。
    • 使用等号加列表初始化时,列表可以包含一个或多个相同类型的元素,此时auto类型会被推导为std::initializer_list<T>
    auto x1 = { 1, 2 }; // x1类型为 std::initializer_list<int>
    auto x2{ 3 }; // x2类型为int
    

通过上述内容,我们可以更好地理解和运用auto关键字,提高代码的灵活性和可读性。接下来的部分将探讨何时使用auto以及更多高级特性。

3.3 何时使用auto

合理使用auto可以提高代码的灵活性和可读性,尤其是在处理复杂类型或模板时。以下是几种推荐使用auto的情况:

  1. 一眼能看出初始化类型的变量:当变量的初始化表达式已经清楚地表明了其类型时,使用auto可以使代码更简洁。

    std::map<std::string, int> str2int;
    // 填充str2int的代码
    for (auto it = str2int.cbegin(); it != str2int.cend(); ++it) {// 处理每个元素
    }
    // 或者使用范围for循环
    for (auto &it : str2int) {// 处理每个元素
    }
    
  2. 复杂的类型:对于那些类型声明冗长或难以书写的类型(如lambda表达式、std::bind等),直接使用auto可以简化代码。

    auto l = [](int a1, int a2) { return a1 + a2; }; // lambda表达式int sum(int a1, int a2) { return a1 + a2; }
    auto b = std::bind(sum, 5, std::placeholders::_1); // 使用std::bind
    
  3. 模板编程:在模板编程中,类型推导可以帮助减少重复代码,特别是在需要处理多种类型的场景下。

  4. 避免显式的类型转换:使用auto可以避免不必要的显式类型转换,使代码更加自然和易读。

3.4 返回类型推导

C++14引入了对函数返回类型自动推导的支持,允许将返回类型声明为auto。这使得编写泛型代码变得更加简单:

auto sum(int a1, int a2) {return a1 + a2; // 编译器会根据返回值推导出返回类型为int
}

需要注意的是,如果一个函数有多个返回路径,并且这些路径返回不同类型的值,则编译器无法进行类型推导,会导致编译错误。

3.5 在Lambda表达式中使用auto

C++14还扩展了lambda表达式的功能,允许在lambda表达式的形参列表中使用auto,从而创建泛型lambda表达式:

auto l = [](auto a1, auto a2) { return a1 + a2; };
auto retval = l(5, 5.0); // a1被推导为int,a2被推导为double,retval被推导为double

此外,lambda表达式还可以通过auto返回引用类型:

auto l = [](int &i) -> auto& { return i; };
auto x1 = 5;
auto &x2 = l(x1);
assert(&x1 == &x2); // 检查是否指向同一内存地址

这是让lambda表达式返回引用类型的唯一方法。

3.6 非类型模板参数占位符

C++17进一步扩展了auto的功能,使其可以用作非类型模板参数的占位符。这意味着可以在模板声明中使用auto作为参数类型:

#include <iostream>template<auto N>
void f() {std::cout << N << std::endl;
}int main() {f<5>(); // N为int类型f<'c'>(); // N为char类型// f<5.0>(); // 错误:模板参数不能为double
}

这个特性允许模板函数接受任何类型的常量作为参数,只要该类型支持作为模板参数。

总结

通过本章的学习,我们了解了auto关键字在现代C++中的重要作用及其丰富的应用场景。从简化复杂类型声明到支持泛型编程,再到与lambda表达式的结合使用,auto极大地增强了C++代码的灵活性和可维护性。合理利用这些特性,可以帮助开发者编写更加高效、简洁的代码。希望这些内容能帮助你在日常开发中更好地运用auto,提升编码效率和代码质量。

第4章 decltype说明符(C++11~C++17)

4.1 回顾 typeoftypeid

在C++11标准发布之前,GCC提供了一个名为typeof的扩展运算符,用于获取操作数的具体类型。例如:

int a = 0;
typeof(a) b = 5; // b被推导为int类型

除了使用typeof,C++标准还提供了typeid运算符来获取与目标操作数类型相关的详细信息。这些信息存储在一个std::type_info对象中,可以通过调用其成员函数name()来获取类型的名称。例如:

int x1 = 0;
double x2 = 5.5;
std::cout << typeid(x1).name() << std::endl; // 输出 "int"
std::cout << typeid(x1 + x2).name() << std::endl; // 输出 "double"
std::cout << typeid(int).name() << std::endl; // 输出 "int"

关于typeid的几点重要特性:

  1. 生命周期typeid的返回值是一个左值,其生命周期持续到程序结束。
  2. 引用和指针std::type_info删除了复制构造函数,因此只能通过引用或指针保存其结果:
    auto t1 = typeid(int); // 编译失败,没有复制构造函数
    auto &t2 = typeid(int); // 编译成功,t2推导为const std::type_info&
    auto t3 = &typeid(int); // 编译成功,t3推导为const std::type_info*
    
  3. 忽略cv限定符typeid忽略类型的cv限定符,即typeid(const T)等同于typeid(T)
4.2 使用 decltype 说明符

C++11引入了decltype说明符,用于获取对象或表达式的类型。其语法类似于typeof

int x1 = 0;
decltype(x1) x2 = 0; // x2被推导为int类型
double x3 = 0;
decltype(x1 + x3) x4 = x1 + x3; // x4被推导为double类型
// decltype({1, 2}) x5; // 编译失败,{1, 2}不是表达式

auto不同,decltype可以在非静态成员变量中使用:

struct S1 {int x1;decltype(x1) x2; // x2被推导为int类型double x3;decltype(x2 + x3) x4; // x4被推导为double类型
};

在函数形参列表中使用decltype

int x1 = 0;
decltype(x1) sum(decltype(x1) a1, decltype(a1) a2) {return a1 + a2;
}
auto x2 = sum(5, 10); // x2被推导为int类型

为了更好地讨论decltype的优势,考虑以下例子:

auto sum(int a1, int a2) -> int {return a1 + a2;
}

在C++11中,auto作为占位符无法使编译器自动推导函数返回类型,必须使用返回类型后置的形式指定返回类型。如果想泛化这个函数以支持各种类型运算,需要使用模板:

template<class R, class T1, class T2>
R sum(T1 a1, T2 a2) {return a1 + a2;
}
auto x3 = sum<double>(5, 10.5); // x3被推导为double类型

为了简化代码,可以进一步优化:

template<class T1, class T2>
auto sum(T1 a1, T2 a2) -> decltype(a1 + a2) {return a1 + a2;
}
auto x4 = sum(5, 10.5); // x4被推导为double类型

在C++14中,可以直接使用auto进行返回类型推导:

template<class T1, class T2>
auto sum(T1 a1, T2 a2) {return a1 + a2;
}
auto x5 = sum(5, 10.5); // x5被推导为double类型

尽管C++14支持对auto声明的返回类型进行推导,但在某些情况下仍然需要使用decltype,例如返回引用类型时:

template<class T>
auto return_ref(T& t) -> decltype(t) {return t;
}
int x1 = 0;
static_assert(std::is_reference_v<decltype(return_ref(x1))>); // 编译成功
4.3 推导规则

decltype(e)(其中e的类型为T)的推导规则如下:

  1. 标识符表达式:如果e是一个未加括号的标识符表达式(结构化绑定除外)或者未加括号的类成员访问,则decltype(e)推断出的类型是e的类型T。如果不存在这样的类型,或者e是一组重载函数,则无法进行推导。
  2. 函数调用:如果e是一个函数调用或者仿函数调用,那么decltype(e)推断出的类型是其返回值的类型。
  3. 左值:如果e是一个类型为T的左值,则decltype(e)是T&。
  4. 将亡值:如果e是一个类型为T的将亡值,则decltype(e)是T&&。
  5. 其他情况:除去以上情况,则decltype(e)是T。

示例:

const int&& foo();
int i;
struct A {double x;
};
const A* a = new A();decltype(foo()); // const int&&
decltype(i); // int
decltype(a->x); // double
decltype((a->x)); // const double&

更多示例:

int i;
int *j;
int n[10];
const int&& foo();
decltype(static_cast<short>(i)); // short
decltype(j); // int*
decltype(n); // int[10]
decltype(foo); // 函数类型
struct A {int operator() () { return 0; }
};
A a;
decltype(a()); // int

复杂表达式示例:

int i;
int *j;
int n[10];
decltype(i=0); // int&
decltype(0,i); // int&
decltype(i,0); // int
decltype(n[5]); // int&
decltype(*j); // int&
decltype(static_cast<int&&>(i)); // int&&
decltype(i++); // int
decltype(++i); // int&
decltype("hello world"); // const char(&)[12]
4.4 cv限定符的推导

通常情况下,decltype(e)所推导的类型会同步e的cv限定符:

const int i = 0;
decltype(i); // const int

当e是未加括号的成员变量时,父对象表达式的cv限定符会被忽略:

struct A {double x;
};
const A* a = new A();
decltype(a->x); // double

当e是加括号的数据成员时,父对象表达式的cv限定符会同步到推断结果:

struct A {double x;
};
const A* a = new A();
decltype((a->x)); // const double&
4.5 decltype(auto)

C++14引入了decltype(auto)组合,它告诉编译器使用decltype的推导规则来推导auto。需要注意的是,decltype(auto)必须单独声明,不能结合指针、引用以及cv限定符:

int i;
int&& f();
auto x1a = i; // int
decltype(auto) x1d = i; // int
auto x2a = (i); // int
decltype(auto) x2d = (i); // int&
auto x3a = f(); // int
decltype(auto) x3d = f(); // int&&
auto x4a = { 1, 2 }; // std::initializer_list<int>
// decltype(auto) x4d = { 1, 2 }; // 编译失败, {1, 2}不是表达式
auto *x5a = &i; // int*
// decltype(auto)*x5d = &i; // 编译失败,decltype(auto)必须单独声明

简化返回类型后置的语法:

template<class T>
decltype(auto) return_ref(T& t) {return t;
}
int x1 = 0;
static_assert(std::is_reference_v<decltype(return_ref(x1))>);
4.6 decltype(auto) 作为非类型模板形参占位符

在C++17中,decltype(auto)也能作为非类型模板形参的占位符,其推导规则与前面介绍的一致:

#include <iostream>template<decltype(auto) N>
void f() {std::cout << N << std::endl;
}static const int x = 11;
static int y = 7;int main() {f<x>(); // N为const int类型f<(x)>(); // N为const int&类型// f<y>(); // 编译错误,y不是一个常量f<(y)>(); // N为int&类型
}

总结

通过本章的学习,我们了解了decltype及其变体decltype(auto)在现代C++中的重要作用及其应用场景。合理利用这些特性,可以帮助开发者编写更加高效、简洁和灵活的代码。无论是简化复杂的类型声明,还是处理泛型编程中的细节问题,decltype都提供了强大的支持。希望这些内容能帮助你在日常开发中更好地运用decltype,提升编码效率和代码质量。

第5章 函数返回类型后置与推导

5.1 使用函数返回类型后置声明函数

C++11引入了函数返回类型后置的语法,允许在函数声明中将返回类型放在参数列表之后。这种语法特别适用于返回类型复杂的场景,如返回函数指针类型。以下是基本示例:

auto foo() -> int {return 42;
}

对于更复杂的返回类型,比如返回一个函数指针,返回类型后置可以显著提高代码的可读性:

int bar_impl(int x) {return x;
}typedef int(*bar)(int);bar foo1() {return bar_impl;
}auto foo2() -> int(*)(int) {return bar_impl;
}int main() {auto func = foo2();func(58);
}

在这个例子中,foo2 使用返回类型后置的方式定义了一个返回类型为 int(*)(int) 的函数。

5.2 推导函数模板返回类型

在C++11标准中,函数返回类型后置的一个重要用途是推导函数模板的返回类型。通过结合 decltype 说明符,可以在编译时根据参数类型推导出返回类型。例如:

template<class T1, class T2>
auto sum1(T1 t1, T2 t2) -> decltype(t1 + t2) {return t1 + t2;
}int main() {auto x1 = sum1(4, 2);
}

这里,decltype(t1 + t2) 用于推导 sum1 函数的实际返回类型。需要注意的是,decltype(t1 + t2) 不能写在函数声明之前,因为编译器在解析返回类型时还未解析到参数部分,因此无法识别 t1t2

另一种方法是直接在函数声明前使用 decltype,但这会导致需要调用类型的默认构造函数,这在某些情况下可能会导致编译失败。例如:

class IntWrap {
public:IntWrap(int n) : n_(n) {}IntWrap operator+ (const IntWrap& other) {return IntWrap(n_ + other.n_);}private:int n_;
};template<class T1, class T2>
decltype(T1() + T2()) sum2(T1 t1, T2 t2) {return t1 + t2;
}int main() {// 编译失败,IntWrap没有默认构造函数sum2(IntWrap(1), IntWrap(2));
}

为了克服这个问题,可以使用以下两种方法:

  1. 使用指针转换和解引用
template<class T1, class T2>
decltype(*static_cast<T1*>(nullptr) + *static_cast<T2*>(nullptr)) 
sum3(T1 t1, T2 t2) {return t1 + t2;
}

这种方法通过将 nullptr 转换为 T1T2 类型的指针,并解引用它们来进行求和操作。由于编译器不会真正执行这些操作,因此不会引发运行时错误。

  1. 使用 std::declval

std::declval 是标准库提供的一个工具函数,它将类型 T 转换为引用类型,而不需要实际构造对象。这使得在 decltype 中使用表达式成为可能,而无需依赖默认构造函数。

#include <utility> // 包含 std::declvaltemplate<class T1, class T2>
decltype(std::declval<T1>() + std::declval<T2>()) 
sum4(T1 t1, T2 t2) {return t1 + t2;
}int main() {sum3(IntWrap(1), IntWrap(2));sum4(IntWrap(1), IntWrap(2));
}

这两种方法都能有效地解决在推导复杂返回类型时遇到的问题,同时保持代码的清晰和简洁。

总结

通过本章的学习,我们了解了如何使用C++11中的函数返回类型后置语法来简化复杂返回类型的声明。此外,我们还探讨了如何利用 decltypestd::declval 来推导函数模板的返回类型,从而避免因默认构造函数缺失而导致的编译错误。合理运用这些特性,可以使代码更加简洁、易读且功能强大。希望这些内容能帮助你在日常开发中更好地处理复杂返回类型的场景。

相关文章:

C++泛型编程指南08 auto decltype

文章目录 [TOC]第3章&#xff1a;auto占位符&#xff08;C11&#xff5e;C17&#xff09;3.1 auto关键字的重新定义3.2 类型推导规则 3.3 何时使用auto3.4 返回类型推导3.5 在Lambda表达式中使用auto3.6 非类型模板参数占位符 总结第4章 decltype说明符&#xff08;C11&#xf…...

php的使用及 phpstorm环境部署

php语法 环境搭建&#xff1a;在小皮中新建网站&#xff0c;注意先填写域名再点击选择根目录。 成功创建网站后&#xff0c;打开发现forbidden&#xff0c;因为新建的网站里是空的&#xff0c;需要新建index.php文件----> 在Phpstorm中左上角打开文件&#xff0c;打开那个文…...

人工智能学习(五)之机器学习逻辑回归算法

深入剖析机器学习逻辑回归算法 一、引言 在机器学习领域&#xff0c;逻辑回归是一种极为经典且应用广泛的算法。虽说名字里带有 “回归”&#xff0c;但它主要用于解决分类问题&#xff0c;在医学、金融、互联网等多个领域都发挥着关键作用。例如&#xff0c;在医学上辅助判断…...

Kubernetes学习之包管理工具(Helm)

一、基础知识 1.如果我们需要开发微服务架构的应用&#xff0c;组成应用的服务可能很多&#xff0c;使用原始的组织和管理方式就会非常臃肿和繁琐以及较难管理&#xff0c;此时我们需要一个更高层次的工具将这些配置组织起来。 2.helm架构&#xff1a; chart:一个应用的信息集合…...

数据结构课程设计(四)校园导航

4 校园导航 4.1 需求规格说明 【问题描述】 一个学校平面图&#xff0c;至少包括10个以上的场所&#xff0c;每个场所带有编号、坐标、名称、类别等信息&#xff0c;两个场所间可以有路径相通&#xff0c;路长&#xff08;耗时&#xff09;各有不同。要求读取该校园平面图&a…...

(done) MIT6.S081 2023 学习笔记 (Day7: LAB6 Multithreading)

网页&#xff1a;https://pdos.csail.mit.edu/6.S081/2023/labs/thread.html (任务1教会了你如何用 C 语言调用汇编&#xff0c;编译后链接即可) 任务1&#xff1a;Uthread: switching between threads (完成) 在这个练习中&#xff0c;你将设计一个用户级线程系统中的上下文切…...

大年初六,风很大

北京的风在立春附近的几天突然大了&#xff0c;正在盘算着这个冬天可能就这样平庸的去了&#xff0c;没成想风来了。走在风中&#xff0c;穿着本应该是三九天穿的冬装&#xff0c;紧闭着嘴&#xff0c;缩着身子&#xff0c;感受着这冬天该有的低温。这是冬天该有的样子&#xf…...

【算法】回溯算法专题③ ——排列型回溯 python

目录 前置小试牛刀回归经典举一反三总结 前置 【算法】回溯算法专题① ——子集型回溯 python 【算法】回溯算法专题② ——组合型回溯 剪枝 python 小试牛刀 全排列 https://leetcode.cn/problems/permutations/description/ 给定一个不含重复数字的数组 nums &#xff0c;返…...

利用deepseek参与软件测试 基本架构如何 又该在什么环节接入deepseek

利用DeepSeek参与软件测试&#xff0c;可以考虑以下基本架构和接入环节&#xff1a; ### 基本架构 - **数据层** - **测试数据存储**&#xff1a;用于存放各种测试数据&#xff0c;包括正常输入数据、边界值数据、异常数据等&#xff0c;这些数据可以作为DeepSeek的输入&…...

99.20 金融难点通俗解释:中药配方比喻马科维茨资产组合模型(MPT)

目录 0. 承前1. 核心知识点拆解2. 中药搭配比喻方案分析2.1 比喻的合理性 3. 通俗易懂的解释3.1 以中药房为例3.2 配方原理 4. 实际应用举例4.1 基础配方示例4.2 效果说明 5. 注意事项5.1 个性化配置5.2 定期调整 6. 总结7. 代码实现 0. 承前 本文主旨&#xff1a; 本文通过中…...

为AI聊天工具添加一个知识系统 之79 详细设计之20 正则表达式 之7

本文要点 要点 “正则表达式” 本来是计算机科学计算机科学的一个概念。本项目将它推广&#xff08;扩张&#xff09;到认知科学的“认知范畴”概念&#xff0c; 聚合&#xff08;收敛&#xff09;到 神经科学 的“神经元”概念。 做法是&#xff1a;用reg 来系统化定义认知…...

[ Spring ] Spring Boot Mybatis++ 2025

文章目录 StructureMyBatis Controller AbilitiesConfigure Plugins and RepositoriesApply Plugins and Add DependenciesMyBatis Spring PropertiesMyBatis ApplicationMyBatis BeansMyBatis MapperMyBatis Query Builder Structure this blog introduce 3 ways using mybat…...

虚幻基础17:动画层接口

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 animation layer interface animation layer interface 动画层接口&#xff1a;动画图表的集。仅有名字。 添加到动画蓝图中&#xff0c;由动画蓝图实现动画图表。...

前缀和算法

文章目录 算法总览题目1371.每个元音包含偶数次的最长子字符串 算法总览 题目 1371.每个元音包含偶数次的最长子字符串 1371.每个元音包含偶数次的最长子字符串 参考博主的讲解 思路分析&#xff1a;就是得使用前缀和记录情况&#xff0c;dp[i][j]表示s[0] 到s[i] 中&…...

稀疏混合专家架构语言模型(MoE)

注&#xff1a;本文为 “稀疏混合专家架构语言模型&#xff08;MoE&#xff09;” 相关文章合辑。 手把手教你&#xff0c;从零开始实现一个稀疏混合专家架构语言模型&#xff08;MoE&#xff09; 机器之心 2024年02月11日 12:21 河南 选自huggingface 机器之心编译 机器之心…...

深入理解 `box-sizing: border-box;`:CSS 布局的利器

深入理解 box-sizing: border-box;&#xff1a;CSS 布局的利器 默认行为示例代码 使用 box-sizing: border-box;示例代码 全局应用 box-sizing: border-box;示例代码 实际应用场景1. 表单布局2. 网格布局 总结 在 CSS 中&#xff0c;box-sizing 属性决定了元素的总宽度和高度是…...

MySQL不适合创建索引的11种情况

文章目录 前言1. **数据量小的表**2. **频繁更新的列**3. **低选择性的列**4. **频繁插入和删除的表**5. **查询中很少使用的列**6. **大文本或BLOB列**7. **复合索引中未使用的前导列**8. **频繁进行批量插入的表**9. **查询返回大部分数据的表**10. **临时表**11. **列值频繁…...

shell呈现数据——在脚本中重定向

重定向输出 只需简单地重定向相应的文件描述符&#xff0c;就可以在脚本中用文件描述符STDOUT和STDERR在多个位置生成输出。在脚本中重定向输出的方法有两种。 临时重定向每一行。永久重定向脚本中的所有命令。 下面将具体展示这两种方法的工作原理。 1.临时重定向 如果你…...

vector容器(详解)

本文最后是模拟实现全部讲解&#xff0c;文章穿插有彩色字体&#xff0c;是我总结的技巧和关键 1.vector的介绍及使用 1.1 vector的介绍 https://cplusplus.com/reference/vector/vector/&#xff08;vector的介绍&#xff09; 了解 1. vector是表示可变大小数组的序列容器。…...

【初/高中生讲机器学习】0. 本专栏 “食用” 指南——写在一周年之际⭐

创建时间&#xff1a;2025-01-27 首发时间&#xff1a;2025-01-29 最后编辑时间&#xff1a;2025-01-29 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名高一学生&#xff0c;热爱计…...

SAP SD学习笔记28 - 请求计划(开票计划)之2 - Milestone请求(里程碑开票)

上一章讲了请求计划&#xff08;开票计划&#xff09;中的 定期请求。 SAP SD学习笔记27 - 请求计划(开票计划)之1 - 定期请求-CSDN博客 本章继续来讲请求计划&#xff08;开票计划&#xff09;的其他内容&#xff1a; Milestone请求(里程碑请求)。 目录 1&#xff0c;Miles…...

【PyTorch介绍】

PyTorch 是什么&#xff1f; PyTorch 是一个开源的深度学习框架&#xff0c;由 Facebook 的人工智能研究实验室&#xff08;FAIR&#xff09;开发和维护。它是一个基于 Python 的库&#xff0c;专为深度学习和人工智能研究设计&#xff0c;支持动态计算图&#xff08;dynamic …...

语言月赛 202412【正在联系教练退赛】题解(AC)

》》》点我查看「视频」详解》》》 [语言月赛 202412] 正在联系教练退赛 题目背景 在本题中&#xff0c;我们称一个字符串 y y y 是一个字符串 x x x 的子串&#xff0c;当且仅当从 x x x 的开头和结尾删去若干个&#xff08;可以为 0 0 0 个&#xff09;字符后剩余的字…...

【C++】B2122 单词翻转

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 &#x1f4af;一、我的做法代码实现&#xff1a;代码解析思路分析 &#x1f4af;二、老师的第一种做法代码实现&a…...

redis基本数据结构

基本数据结构 String String是Redis中最常见的数据存储类型&#xff1a; 其基本编码方式是RAW&#xff0c;基于简单动态字符串&#xff08;SDS&#xff09;实现&#xff0c;存储上限为512mb。 如果存储的SDS长度小于44字节&#xff0c;则会采用EMBSTR编码&#xff0c;此时ob…...

基于STM32景区环境监测系统的设计与实现(论文+源码)

1系统方案设计 根据系统功能的设计要求&#xff0c;展开基于STM32景区环境监测系统设计。如图2.1所示为系统总体设计框图。系统以STM32单片机作为系统主控模块&#xff0c;通过DHT11传感器、MQ传感器、声音传感器实时监测景区环境中的温湿度、空气质量以及噪音数据。系统监测环…...

使用冒泡排序模拟实现qsort函数

1.冒泡排序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int arr[] { 0,2,5,3,4,8,9,7,6,1 };int sz sizeof(arr) / sizeof(arr[0]);//冒泡排序一共排序 sz-1 趟for (int i 0; i < sz - 1; i){//标志位&#xff0c;如果有序&#xff0c;直接…...

探秘Linux IO虚拟化:virtio的奇幻之旅

在当今数字化时代&#xff0c;虚拟化技术早已成为推动计算机领域发展的重要力量。想象一下&#xff0c;一台物理主机上能同时运行多个相互隔离的虚拟机&#xff0c;每个虚拟机都仿佛拥有自己独立的硬件资源&#xff0c;这一切是如何实现的呢&#xff1f;今天&#xff0c;就让我…...

在React中使用redux

一、首先安装两个插件 1.Redux Toolkit 2.react-redux 第一步&#xff1a;创建模块counterStore 第二步&#xff1a;在store的入口文件进行子模块的导入组合 第三步&#xff1a;在index.js中进行store的全局注入 第四步&#xff1a;在组件中进行使用 第五步&#xff1a;在组件中…...

从 C 到 C++:理解结构体中字符串的存储与操作

对于刚入门 C/C 的程序员来说&#xff0c;字符串的存储和操作可能是个容易混淆的知识点。在 C 中&#xff0c;std::string 提供了非常友好的接口&#xff0c;我们可以轻松地在结构体中使用字符串类型&#xff0c;无需关注底层细节。然而&#xff0c;在 C 语言中&#xff0c;字符…...

2.3学习总结

图&#xff1a; 1.图的基本概念 2.图的存储和遍历 3.最小生成树 4.最短路径 5.拓扑排序和关键路径 一、图的基本概念 图的定义&#xff1a;不允许没有顶点&#xff0c;但边集可以为空 {无向图 {有向图&#xff1a;边弧&#xff0c;弧头&#xff08;有箭头&#xff09;…...

wordpress代码结构解析

WordPress 是一个基于 PHP 和 MySQL 的开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;广泛用于构建网站和博客。要解析 WordPress 代码&#xff0c;首先需要了解其核心结构、主要文件和常用的函数。以下是 WordPress 代码解析的基本指南&#xff1a; --- ### 1. *…...

使用 Numpy 自定义数据集,使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数

1. 导入必要的库 首先&#xff0c;导入我们需要的库&#xff1a;Numpy、Pytorch 和相关工具包。 import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import accuracy_score, recall_score, f1_score2. 自定义数据集 …...

FPGA|例化生成的PLL功能IP核

1、例化上一篇文章中调用的IP核&#xff0c;新建文件PLL_test.v 2、代码如图 timescale 1ns / 1ps module PLL_test(input clk,input rst_n,output clkout0,output clkout1,output clkout2,output clkout3,output clkout4);wire locked;PLL pll_inst(.inclk0(clk),.c0(clkout0)…...

K个不同子数组的数目--滑动窗口--字节--亚马逊

Stay hungry, stay foolish 题目描述 给定一个正整数数组 nums和一个整数 k&#xff0c;返回 nums 中 「好子数组」 的数目。 如果 nums 的某个子数组中不同整数的个数恰好为 k&#xff0c;则称 nums 的这个连续、不一定不同的子数组为 「好子数组 」。 例如&#xff0c;[1,2,…...

手机连接WIFI可以上网,笔记本电脑连接WIFI却不能上网? 解决方法?

原因&#xff1a;DNS受污染了 解决办法 step 1&#xff1a;清空域名解析记录&#xff08;清空DNS&#xff09; ipconfig /flushdns (Windows cmd命令行输入) step 2&#xff1a;重新从DHCP 获取IP ipconfig /release&#xff08;释放当前IP地址&#xff09; ipconfig /renew &…...

大模型综述一镜到底(全文八万字) ——《Large Language Models: A Survey》

论文链接&#xff1a;https://arxiv.org/abs/2402.06196 摘要&#xff1a;自2022年11月ChatGPT发布以来&#xff0c;大语言模型&#xff08;LLMs&#xff09;因其在广泛的自然语言任务上的强大性能而备受关注。正如缩放定律所预测的那样&#xff0c;大语言模型通过在大量文本数…...

C语言按位取反【~】详解,含原码反码补码的0基础讲解【原码反码补码严格意义上来说属于计算机组成原理的范畴,不过这也是学好编程初级阶段的必修课】

目录 概述【适合0基础看的简要描述】&#xff1a; 上述加粗下划线的内容提取版&#xff1a; 从上述概述中提取的核心知识点&#xff0c;需背诵&#xff1a; 整数【包含整数&#xff0c;负整数和0】的原码反码补码相互转换的过程图示&#xff1a; 过程详细刨析&#xff1a;…...

本地部署与使用SenseVoice语音大模型简析

前言 SenseVoice 是一种语音基础模型&#xff0c;具有多种语音理解功能&#xff0c;包括自动语音识别 (ASR)、口语识别 (LID)、语音情感识别 (SER) 和音频事件检测 (AED)。本博客将指导您安装和使用 SenseVoice 模型&#xff0c;使其尽可能方便用户使用。 Github 仓库链接: ht…...

QMK启用摇杆和鼠标按键功能

虽然选择了触摸屏&#xff0c;我仍选择为机械键盘嵌入摇杆模块&#xff0c;这本质上是对"操作连续性"的执着。   值得深思的是&#xff0c;本次开发过程中借助DeepSeek的代码生成与逻辑推理&#xff0c;其展现的能力已然颠覆传统编程范式&#xff0c;需求描述可自动…...

排序算法与查找算法

1.十大经典排序算法 我们希望数据以一种有序的形式组织起来&#xff0c;无序的数据我们要尽量将其变得有序 一般说来有10种比较经典的排序算法 简单记忆为Miss D----D小姐 时间复杂度 &#xff1a;红色<绿色<蓝色 空间复杂度&#xff1a;圆越大越占空间 稳定性&…...

基于Spring Security 6的OAuth2 系列之九 - 授权服务器--token的获取

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级…...

【思维导图】redis

学习计划&#xff1a;将目前已经学的知识点串成一个思维导图。在往后的学习过程中&#xff0c;不断往思维导图里补充&#xff0c;形成自己整个知识体系。对于思维导图里的每个技术知识&#xff0c;自己用简洁的话概括出来&#xff0c; 训练自己的表达能力。...

【Git】使用笔记总结

目录 概述安装Git注册GitHub配置Git常用命令常见场景1. 修改文件2. 版本回退3. 分支管理 常见问题1. git add [中文文件夹] 无法显示中文问题2. git add [文件夹] 文件名中含有空格3. git add 触发 LF 回车换行警告4. git push 提示不存在 Origin 仓库5. Git与GitHub中默认分支…...

cf div3 998 E(并查集)

E : 给出两个简单无向图 &#xff08;没有重边和自环&#xff09;f g . 可以对f 进行 删边 和加边 的操作。问至少操作多少次 &#xff0c;使得 f 和 g 的 点的联通情况相同&#xff08;并查集的情况相同&#xff09; 首先思考删边 &#xff1a; 对于 我 f 图存在边 e &#x…...

【C++】string类(上):string类的常用接口介绍

文章目录 前言一、C中设计string类的意义二、string类的常用接口说明1. string类对象的常见构造2. string类对象的容量操作2.1 size、capacity 和 empty的使用2.2 clear的使用2.3 reserve的使用2.4 resize的使用 3. string类对象的访问及遍历操作3.1 下标[ ] 和 at3.2 迭代器it…...

[SAP ABAP] ABAP SQL跟踪工具

事务码ST05 操作步骤 步骤1&#xff1a;使用事务码ST05之前&#xff0c;将要检测的程序生成的页面先呈现出来&#xff0c;这里我们想看下面程序的取数操作&#xff0c;所以停留在选择界面 步骤2&#xff1a; 新建一个GUI窗口&#xff0c;输入事务码ST05&#xff0c;点击 Acti…...

OpenGL学习笔记(六):Transformations 变换(变换矩阵、坐标系统、GLM库应用)

文章目录 向量变换使用GLM变换&#xff08;缩放、旋转、位移&#xff09;将变换矩阵传递给着色器坐标系统与MVP矩阵三维变换绘制3D立方体 & 深度测试&#xff08;Z-buffer&#xff09;练习1——更多立方体 现在我们已经知道了如何创建一个物体、着色、加入纹理。但它们都还…...

PHP 常用函数2025.02

PHP implode() 函数 语法 implode(separator,array) 参数描述separator可选。规定数组元素之间放置的内容。默认是 ""&#xff08;空字符串&#xff09;。array必需。要组合为字符串的数组。 技术细节 返回值&#xff1a;返回一个由数组元素组合成的字符串。PHP 版…...

17.3.4 颜色矩阵

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 17.3.4.1 矩阵基本概念 矩阵&#xff08;Matrix&#xff09;是一个按照长方阵列排列的复数或实数集合&#xff0c;类似于数组。 由…...