C++核心编程运算符的重载
C++核心编程运算符的重载
文章目录
- C++核心编程运算符的重载
- 1.“+”运算符的重载
- 1.1 作为成员函数重载
- 1.2 作为全局函数重载
- 2."<<"运算符重载
- 2.1为什么需要重载左移运算符
- 2.2如何重载左移运算符
- 2.3注意事项
- 3."++"运算符重载
- 3.1 前置递增运算符重载
- 3.2后置递增运算符重载
- 3.3注意事项
- 4.赋值运算符重载
- 4.1解释
- 4.2注意事项
- 5.关系运算符的重载
- 5.1解释
- 5.2关键点
- 6.函数调用运算符重载
- 6.1示例
- 6.2注意事项
运算符重载在C++等编程语言中是一种重要的特性,它允许程序员为已存在的运算符提供额外的或定制的行为,尤其是针对用户自定义类型(如类和结构体)。以下是几个关键原因,解释了为什么需要运算符重载:
-
提升代码的自然度和可读性:通过运算符重载,可以让自定义类型像内置类型一样使用熟悉的运算符。例如,如果你定义了一个复数类,重载加号运算符(
+
)可以让复数相加就像普通整数或浮点数相加一样自然,这使得代码更易于阅读和理解。 -
增强表达能力:运算符重载能够以紧凑的形式表达复杂的操作,避免了使用长而晦涩的函数名称。这样可以让代码更加简洁,减少编程时的认知负担。
-
保持一致性:对于用户自定义类型,如果不能重载运算符,那么在处理这些类型时,可能需要引入全新的方法或函数来完成类似内置类型的运算,这会破坏语言使用的一致性体验。
-
支持泛型编程:运算符重载是实现模板和泛型算法的关键,它允许算法以统一的方式处理多种类型,只要这些类型支持相应的运算符。
-
提高效率:在某些情况下,通过精心设计的运算符重载,可以避免不必要的对象复制,减少临时对象的创建,从而提升程序的运行效率。
-
适应面向对象编程:在面向对象编程中,类和对象经常需要进行比较、组合等操作,运算符重载使得这些操作可以直接利用运算符,而不是通过复杂的函数调用来实现,更加符合面向对象的设计理念。
运算符重载是实现代码高效、清晰、一致的重要机制,特别是在处理自定义类型时,它极大地增强了语言的表达能力和灵活性。
1.“+”运算符的重载
在C++中,加号运算符(+
)的重载允许你自定义当加号应用于自定义类型时的行为。你可以通过两种方式重载加号运算符:作为成员函数或作为友元函数(全局函数)。下面是两种方式的概览和示例:
1.1 作为成员函数重载
当作为成员函数重载时,加号运算符接受一个参数,这个参数是你要与当前对象相加的对象。返回值通常是该操作的结果,通常是一个新对象或者引用。
class MyClass {
public:// 成员函数重载加号运算符MyClass operator+(const MyClass& other) {MyClass result;// 执行相加操作,例如:result.value = this->value + other.value;return result;}private:int value;
};int main() {MyClass obj1(10);MyClass obj2(20);MyClass sum = obj1 + obj2; // 使用重载的加号运算符// ...
}
示例2:
//
// Created by 86189 on 2024/6/10.
//
#include "iostream"
using namespace std;class Complex {
public:int real;int imag;Complex operator+(Complex &c2) const{Complex c3{};c3.real = this->real + c2.real;c3.imag = this->imag + c2.imag;return c3;}
};int main() {Complex c1{}, c2{} , c3{};c1.real = 10;c1.imag = 20;c2.real = 5;c2.imag = 10;c3 = c1 + c2;cout << c3.real << endl;cout << c3.imag << endl;return 0;
}
1.2 作为全局函数重载
作为全局函数(友元函数)重载时,加号运算符接受两个参数,这两个参数都是要相加的对象。这种方式的好处是可以访问第一个对象的私有或保护成员。
class MyClass {
public:int value;// 声明为友元函数,可以在类外部定义friend MyClass operator+(const MyClass& lhs, const MyClass& rhs);
};// 全局函数实现加号运算符重载
MyClass operator+(const MyClass& lhs, const MyClass& rhs) {MyClass result;result.value = lhs.value + rhs.value;return result;
}int main() {MyClass obj1{10};MyClass obj2{20};MyClass sum = obj1 + obj2; // 同样使用重载的加号运算符// ...
}
示例2:
//
// Created by 86189 on 2024/6/10.
//
#include <iostream>
using namespace std;class A {
public:int a;int b;
};
A operator+(A &a, A &b) {A c{};c.a = a.a + b.a;c.b = a.b + b.b;return c;
}int main() {A a1{}, a2{}, a3{};a1.a = 1;a1.b = 2;a2.a = 3;a2.b = 4;a3 = a1 + a2;cout << a3.a << " " << a3.b << endl;return 0;
}
无论哪种方式,重载的加号运算符都应当遵循运算符的一般语义和预期行为,确保操作的直观性和代码的可读性。同时,需要注意的是,当涉及自增(++
)、自减(--
)、赋值(=
)等运算符时,还需要考虑前置与后置版本以及可能需要的拷贝构造或移动构造等细节。
2."<<"运算符重载
在C++中,重载运算符是一种特殊函数,它用于给已有运算符提供自定义的行为,特别是针对用户自定义类型。左移运算符(<<
)通常与输入/输出流(如std::cout
)一起使用来进行数据的输出。但当你想要自定义类型也能支持这样的输出操作时,就需要重载这个运算符。
2.1为什么需要重载左移运算符
当你定义了一个新的类或结构体,并希望像基本数据类型那样方便地将其实例打印出来时,就需要重载<<
运算符。这在调试、日志记录和用户界面显示等方面非常有用。
2.2如何重载左移运算符
以下是一个简单的例子,展示了如何为一个自定义的类MyClass
重载左移运算符:
#include <iostream>class MyClass {
public:int value;// 构造函数MyClass(int v) : value(v) {}// 左移运算符重载函数friend std::ostream& operator<<(std::ostream& os, const MyClass& obj);
};// 实现左移运算符重载函数
std::ostream& operator<<(std::ostream& os, const MyClass& obj) {os << "MyClass object with value: " << obj.value;return os;
}int main() {MyClass obj(10);std::cout << obj << std::endl; // 调用重载后的<<运算符输出obj的内容return 0;
}
在这个例子中,我们定义了一个MyClass
,它有一个成员变量value
。然后,我们声明了一个友元函数来重载<<
运算符,该函数接受一个输出流对象(std::ostream&
)和一个MyClass
的常引用作为参数。在函数内部,我们将MyClass
对象的value
成员插入到输出流中。通过返回os
,我们可以链式调用这个运算符。
2.3注意事项
- 友元函数:在这里,我们将运算符重载函数声明为类的友元,以便它可以直接访问类的私有和保护成员。
- 返回值:重载函数应该返回输出流对象的引用,这样就可以支持连续输出(例如
std::cout << obj1 << obj2;
)。 - const引用:传递对象作为const引用是为了避免复制,提高效率,并允许对const对象进行操作。
通过这种方式,你可以使自定义类型更自然、更方便地融入C++的标准I/O机制中。
重载的一般方式:
//
// Created by 86189 on 2024/6/11.
//
#include "iostream"
using namespace std;class MyClass {
public:int a;int b;MyClass(int a, int b) {this->a = a;this->b = b;}
};
ostream &operator<<(ostream &out, MyClass &myClass) {out << myClass.a << " " << myClass.b;return out;
}int main() {MyClass myClass(1, 2);cout << myClass;return 0;
}
一般情况下的全局函数重载,但这种方式只能访问公有的成员属性和方法(函数)。
3."++"运算符重载
3.1 前置递增运算符重载
前置递增运算符直接对对象进行修改并返回修改后的对象本身。通常,它的声明和定义如下:
class MyClass {
public:// 前置递增运算符重载MyClass& operator++() {// 在这里实现自增逻辑// 例如,如果MyClass代表一个数值,可以简单地增加其值++value; // 假设value是类的一个成员变量return *this; // 返回当前对象的引用}
private:int value;
};
3.2后置递增运算符重载
后置递增运算符需要创建一个临时对象来保存自增前的状态,然后原对象再进行自增操作。C++通过接受一个额外的无关参数(通常是int类型的占位符)来区分前置和后置版本:
class MyClass {
public:// 后置递增运算符重载MyClass operator++(int) { // int参数是后置递增的标志MyClass temp(*this); // 创建临时对象保存当前状态++(*this); // 调用前置递增运算符实现自增return temp; // 返回自增前的对象状态}
private:int value;
};
3.3注意事项
- 确保递增运算符合乎预期,特别是对于复合数据类型或有特殊逻辑的对象。
- 由于后置递增需要复制当前对象状态,因此在性能敏感的应用中应谨慎使用。
- 保持运算符重载的一致性,即前置和后置版本在效果上应等价(除了返回类型和是否立即修改对象外)。
通过上述方式,就可以自定义类对象在使用递增运算符时的行为,使其更符合类的设计意图和使用场景。
递增运算符重载的实际应用:
#include <iostream>
using namespace std;class Complex {
public:int value;explicit Complex(int value) {this->value = value;}Complex& operator++() {++this->value;return *this;}
};class Complex2 {
public:int value;explicit Complex2(int value) {this->value = value;}Complex2 operator++(int) {Complex2 temp(*this);this->value++;return temp;}
};
ostream &operator<<(ostream &out, const Complex c) {out << c.value;return out;
}
ostream &operator<<(ostream &out, const Complex2 c) {out << c.value;return out;
}
int main() {Complex c(1);cout << ++c << endl;cout << c << endl;Complex2 c2(1);cout << c2++ << endl;cout << c2 << endl;return 0;
}
4.赋值运算符重载
在C++中,赋值运算符(=
, assignment operator)可以被重载,以自定义类对象之间赋值的行为。当你想要控制一个类实例如何将值赋给另一个类实例时,重载赋值运算符变得尤为重要。下面是一个简单的示例,展示了如何重载赋值运算符:
#include <iostream>class MyClass {
public:// 成员变量int value;// 默认构造函数MyClass(int v = 0) : value(v) {}// 赋值运算符重载MyClass& operator=(const MyClass& other) {// 防止自我赋值if (this != &other) {// 实现赋值逻辑value = other.value;}// 返回当前对象的引用,支持连续赋值 (a = b = c)return *this;}
};int main() {MyClass obj1(10);MyClass obj2;std::cout << "Before assignment: obj1.value = " << obj1.value << ", obj2.value = " << obj2.value << std::endl;// 使用重载的赋值运算符obj2 = obj1;std::cout << "After assignment: obj1.value = " << obj1.value << ", obj2.value = " << obj2.value << std::endl;return 0;
}
4.1解释
- 成员变量:
MyClass
中有一个成员变量value
。 - 默认构造函数:提供了默认构造方式,可以初始化
value
为0或指定的值。 - 赋值运算符重载:定义了
operator=
函数,它接受一个对同类对象的引用other
作为参数。- 自我赋值检查:通过比较
this
(当前对象地址)和&other
(传入对象地址)来判断是否是自我赋值,这是为了避免在自我赋值情况下出现不必要的操作或错误。 - 赋值逻辑:如果不是自我赋值,就将
other.value
的值赋予当前对象的value
。 - 返回值:重载的赋值运算符通常返回一个对当前对象(
*this
)的引用,这样可以支持连续赋值操作。
- 自我赋值检查:通过比较
4.2注意事项
- 深拷贝与浅拷贝:当类中有指针或动态分配的资源时,必须小心处理深拷贝(复制资源的内容)与浅拷贝(只复制指针)的问题,以避免悬挂指针或资源泄露。
- 复制与交换:有时使用“复制并交换”(copy-and-swap)技术来实现赋值运算符,这是一种既安全又高效的方法。
- 三/五法则:如果重载了赋值运算符,一般也建议重载拷贝构造函数、析构函数、移动构造函数和移动赋值运算符,以保持类的完整性和资源管理的一致性。这被称为C++的“三/五法则”。
5.关系运算符的重载
5.1解释
在C++中,你可以重载关系运算符(如==
, !=
, <
, >
, <=
, >=
)来定义它们在自定义类型上的行为。重载关系运算符可以帮助你更直观地比较自定义类的实例。下面是一个简单的例子,展示了如何为一个简单的Point
类重载==
和<
运算符:
#include <iostream>class Point {
public:int x, y;// 构造函数Point(int x = 0, int y = 0) : x(x), y(y) {}// 重载等于运算符bool operator==(const Point& other) const {return (x == other.x) && (y == other.y);}// 重载小于运算符bool operator<(const Point& other) const {if (y == other.y) {return x < other.x;} else {return y < other.y;}}
};// 为了支持cout输出,重载<<运算符
std::ostream& operator<<(std::ostream& os, const Point& p) {os << "(" << p.x << ", " << p.y << ")";return os;
}int main() {Point p1(1, 2);Point p2(1, 2);Point p3(2, 1);std::cout << "p1 == p2: " << (p1 == p2) << std::endl; // 应输出1,表示真std::cout << "p1 < p3: " << (p1 < p3) << std::endl; // 应输出0,表示假,因为我们定义了先按y比较,后按x比较return 0;
}
5.2关键点
- 重载函数:重载的关系运算符通常被声明为类的成员函数(对于非成员函数,需要定义为友元函数以访问私有成员),并且通常被声明为
const
,因为它们不应该修改对象的状态。 - 返回类型:重载的关系运算符应该返回
bool
类型,表示比较的结果。 - 逻辑一致性:当你重载一个关系运算符时,应确保所有相关运算符(如
<
和>
)的逻辑一致,以避免违反关系运算符的传递性、对称性等属性。 - 友元函数:对于非成员函数形式的关系运算符重载(如
==
),通常将其声明为类的友元函数,以便直接访问类的私有和保护成员。
重载关系运算符可以让你的自定义类型更加自然地融入C++的标准表达式语法中,提高代码的可读性和易用性。
6.函数调用运算符重载
在C++中,直接重载圆括号()
操作符通常是用来实现类的实例作为函数的调用,这种机制常用于仿函数(functor)、智能指针或者任何希望像函数一样被调用的类。重载圆括号操作符是通过在类中定义一个名为operator()
的成员函数来实现的。
6.1示例
下面是一个简单的示例,展示了如何定义一个类来重载圆括号操作符,使其实例可以像函数一样被调用:
#include <iostream>class Functor {
public:// 重载圆括号操作符int operator()(int x, int y) {return x + y; // 这个操作符现在像一个求和函数}
};int main() {Functor adder; // 创建类的实例// 使用类实例像函数一样调用int result = adder(10, 20); std::cout << "Result: " << result << std::endl; // 输出: Result: 30return 0;
}
在这个例子中,Functor
类通过重载operator()
,使得创建的adder
对象可以像函数那样被调用,传入两个整数参数,并返回它们的和。
以及使用匿名对象调用:
#include <iostream>
using namespace std;class myClass{
public:myClass(int a, int b) {this->a = a;this->b = b;}myClass(int a) {this->a = a;this->b = 0;}myClass() {this->a = 0;this->b = 0;}void operator()(const string& s){cout << s << endl;}int operator()(int i, int j){return i + j;}
private:int a;int b;};int main() {myClass myClass1(1, 2);myClass1("hello");cout << myClass()(1, 2) << endl; //匿名对象调用return 0;
}
6.2注意事项
- 返回类型:
operator()
可以有任意合法的返回类型,根据实际需求定义。 - 参数列表:圆括号内的参数列表也可以根据需要自由定义,就像普通函数的参数列表一样。
- 多态性:重载的
operator()
可以实现多态行为,使得类的实例能够以统一的方式处理不同类型的输入。
通过重载圆括号操作符,C++提供了强大的灵活性,允许用户定义能够像函数一样被调用的对象,这对于函数对象(functors)、函数适配器、策略模式等设计模式非常有用。
相关文章:
C++核心编程运算符的重载
C核心编程运算符的重载 文章目录 C核心编程运算符的重载1.“”运算符的重载1.1 作为成员函数重载1.2 作为全局函数重载 2."<<"运算符重载2.1为什么需要重载左移运算符2.2如何重载左移运算符2.3注意事项 3.""运算符重载3.1 前置递增运算符重载3.2后置…...

雷达标定与解析
融合雷达与解析雷达数据的相关代码。感谢开源社区的贡献。以下代码继承了很多人的工作。 如果是单雷达: 直接进行标定,所以就是接收相关的话题然后发布。 lidar_calibration_params.yaml: calibration:在这个接口里面x_offset: 0.0y_offset:…...

养殖自动化温控系统:现代养殖场的智能守护神
现代农业养殖业中,养殖自动化温控系统已经成为提高生产效率和保障动物福利的关键技术之一。本篇文章将深入介绍养殖自动化温控系统的原理、组成、优势及其在不同类型养殖场中的应用实例,并展望该技术的未来发展。 一、养殖自动化温控系统概述 养殖自动…...
用python打印——九九乘法表2
for i in range(1, 10):for j in range(1, i 1):print(f"{j} * {i} {j * i}\t", end)j 1print()外层的 for 循环从 1 到 9 遍历 i。对于每个 i,内层的 for 循环从 1 到 i 遍历 j。在每次循环中,打印出 j 乘以 i 的结果,并以制表…...

如何系统学习机器学习?
我不是计算机专业,第一次接触机器学习还是在研一的时候,当时是看到机器学习可以做号码识别,就觉得好厉害,想学这个。 首次了解到Python这门语言,知道了机器学习可以做什么后,就感觉打开了新世界一样。再后来…...
Qt:1.杂谈
1.前端开发和Qt: 前端开发可以分为网页开发、移动端开发、桌面应用开发。Qt这个技术,是来开发电脑桌面应用程序的,也就是客户端程序的开发。属于比较经典的前端开发体系下。客户端开发的任务:编写和用户交互的界面或者应用程序。大…...

AI视频模型Sora核心功能以及应用场景
随着人工智能技术的飞速发展,AI在视频处理和生成领域的应用正变得越来越广泛。Sora,作为新一代AI视频模型,展示了前所未有的潜力和创新能力。本文将深入探讨Sora的功能、应用场景以及它所带来的革命性变化。 一、Sora的核心功能 1.1 视频生…...

面试-细聊synchronized
1.线程安全问题的主要诱因: 存在多条共享数据(临界资源) 存在多条线程共同操作这些共享数据 解决问题的根本方法: 同一时刻有且仅有一个线程在操作共享数据,其他线程必须等到该线程处理完数据后在对共享数据进行操作。 2.synchroized锁 分…...

AI降重新突破:chatgpt降重工具在学术论文中的应用与效果
论文降重一直是困扰各界毕业生的“拦路虎”,还不容易熬过修改的苦,又要迎来降重的痛。 其实想要给论文降重达标,我有一些独家秘诀。话不多说直接上干货! 1、同义词改写(针对整段整句重复) 这是最靠谱也是…...

Spring学习02-[Spring容器核心技术IOC学习]
Spring容器核心技术IOC学习 什么是bean?如何配置bean?Component方式bean配合配置类的方式import导入方式 什么是bean? 被Spring管理的对象就是bean,和普通对象的区别就是里面bean对象里面的属性也被注入了。 如何配置bean? Component方式、bean配合配置类的方式、import…...

2024上海CDIE 参展预告 | 一站式云原生数字化平台已成趋势
为什么企业需要进行数字化转型?大家都在讨论的数字化转型面临哪些困境?2024.6.25-26 CDIE数字化创新博览会现场,展位【A18】,期待与您相遇,共同探讨企业如何利用数字化技术驱动业务增长。 一、展会介绍——CDIE数字化…...
高考专业组 07组 08组 武汉大学
武汉大学的招生都什么废物点心,搜个专业组都没官方解释! 07组:理学,详见下表专业代码07xxxx,例如数学、物理、化学 08组:工学,详见下表专业代码08xxxx,例如机械、电子信息、自动化、…...

解析JavaScript中逻辑运算符和||的返回值机制
本文主要内容:了解逻辑运算符 &&(逻辑与)和 ||(逻辑或)的返回值。 在JavaScript中,逻辑运算符 &&(逻辑与)和 ||(逻辑或)的返回值可能并不总…...
Java中的数据结构与算法探秘
Java中的数据结构与算法探秘 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 引言 数据结构与算法是计算机科学的基础,对于Java程序员来说&#x…...

AST反混淆实战|嵌套的赋值语句通用还原处理
关注它,不迷路。 本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除! 1.混淆代码 下面的这段代码是来自px3验证码核心混淆代码: function _u…...

Unity的ScrollView滚动视图复用
发现问题 在游戏开发中有一个常见的需求,就是需要在屏幕显示多个(多达上百)显示item,然后用户用手指滚动视图可以选择需要查看的item。 现在的情况是在100个data的时候,Unity引擎是直接创建出对应的100个显示item。 …...

详解Spring AOP(二)
目录 1.切点表达式 1.1execution表达式 1.2 annotation 1.2.1自定义注解MyAspect 1.2.3添加自定义注解 2.Sping AOP原理 2.1代理模式 2.1.1静态代理 2.1.2动态代理 2.1.3JDK动态代理 2.1.4CGLIB动态代理 3.总结 承接上文:详解Spring AOP(一&…...
sql-analysis
文章目录 痛点: 1、无法提前发现慢sql,可能恶化为慢sql的语句 2、线上出现慢sql后,无法快速止损 后果:一般是以响应时间来发现慢sql,这时候已经对业务产生了一定影响,这时候就要改代码重新发布上线或者改数…...

后台管理台字典localStorage缓存删除
localStorage里存放了如以下dictItems_开头的字典数据,localStorage缓存是没有过期时间的,需要手动删除。同时localStorage里还存有其他不需要删除的数据。 这里的方案是遍历localStorage,利用正则和所有key进行匹配,匹配到dict…...

计算机毕业设计PySpark+Hadoop招聘推荐系统 招聘大数据 招聘数据分析 招聘可视化 大数据毕业设计 大数据毕设
1. 管理端: 带有职位的增删改查功能,评论功能是针对新闻模块的,类似新闻大数据的实现 2. 网站端: python / java 协同过滤推荐算法 / 下载职位数据表收费1元每条 / 账户充值 / 短信验证码修改密码 / 身份证识别 / 多条件搜索 3.…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...