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

C++基础语法和概念

基本语法和数据类型

C++ 是一种高性能的编程语言,允许程序员对内存管理进行精细控制。了解 C++ 的基本语法和数据类型是学习这门语言的第一步。以下是一些基础概念的详细介绍:

基本语法

程序结构

一个基础的 C++ 程序通常包括一个或多个头文件引用、一个 main 函数、以及其他函数定义。程序执行从 main 函数开始。

#include <iostream> // 头文件引用// main函数 - 程序入口点
int main() {std::cout << "Hello, World!" << std::endl; // 输出到控制台return 0; // 程序结束
}
变量和数据类型

C++ 提供了多种基本数据类型来存储各种类型的数据:

  • 整型 (int, short, long, long long)
  • 浮点型 (float, double)
  • 字符型 (char)
  • 布尔型 (bool)
int age = 30; // 整型
double salary = 4500.50; // 浮点型
char grade = 'A'; // 字符型
bool isEmployed = true; // 布尔型
控制结构

C++ 使用条件语句(如 if, else)和循环语句(如 for, while)来控制程序的执行流程。

// 条件语句
if (age > 18) {std::cout << "Adult" << std::endl;
} else {std::cout << "Not Adult" << std::endl;
}// 循环语句
for(int i = 0; i < 5; i++) {std::cout << i << " ";
}
函数

函数是执行特定任务的独立代码块。C++ 中的函数可以有参数,也可以有返回值。

// 定义一个函数
int add(int a, int b) {return a + b;
}// 调用函数
int result = add(5, 3); // result 将会是 8

数据类型详解

整型

整型用于存储整数值。C++ 提供了不同大小的整型,如 int(通常是 4 字节)、short(通常是 2 字节)、long(至少和 int 一样长,通常是 4 或 8 字节)和 long long(至少 8 字节)。

浮点型

浮点型用于存储小数。float(通常是 4 字节)提供了约 6-7 位十进制精度,而 double(通常是 8 字节)提供了约 15-16 位十进制精度。

字符型

字符型 char 用于存储单个字符(如字母或数字)。在 C++ 中,char 占用 1 字节。

布尔型

布尔型 bool 用于存储真 (true) 或假 (false) 值。它通常用于条件测试。

标准输入输出

C++ 使用 cincout 进行标准输入输出操作,它们分别用于从键盘读取输入和将输出写入到控制台。

int number;
std::cout << "Enter a number: ";
std::cin >> number; // 从控制台读取一个整数
std::cout << "You entered " << number << std::endl;

使用输入输出流(iostream)

C++ 的输入输出流(IOStream)库提供了一套面向对象的方式来进行输入输出(I/O)操作。这个库定义了用于读写数据的流对象,包括标准输入输出(cin/cout)、文件输入输出(ifstream/ofstream)等。使用 IOStream 库可以让数据的读写变得更加容易和直观。

标准输入输出流

std::cout
  • std::cout 代表“控制台输出”,是用于向标准输出设备(通常是终端或屏幕)写数据的对象。
  • 使用 << 运算符(称为插入运算符)向 std::cout 发送数据。
#include <iostream>int main() {std::cout << "Hello, World!" << std::endl; // 输出字符串,然后换行int age = 25;std::cout << "Age: " << age << std::endl; // 输出字符串和变量的值,然后换行return 0;
}
std::cin
  • std::cin 代表“控制台输入”,是用于从标准输入设备(通常是键盘)读取数据的对象。
  • 使用 >> 运算符(称为提取运算符)从 std::cin 提取数据。
#include <iostream>int main() {int number;std::cout << "Enter a number: ";std::cin >> number; // 从用户处读取一个整数std::cout << "You entered: " << number << std::endl;return 0;
}

标准错误流

  • std::cerr 用于输出错误信息。与 std::cout 不同的是,std::cerr 不经过缓冲区直接输出,确保了即使程序崩溃,错误信息也能立即显示。
#include <iostream>int main() {std::cerr << "An error occurred" << std::endl;return 0;
}

标准日志流

  • std::clog 类似于 std::cerr,但用于输出日志信息。输出到 std::clog 也是不缓冲的。
#include <iostream>int main() {std::clog << "Log message" << std::endl;return 0;
}

格式化输出

IOStream 提供了多种方式来格式化输出,例如设置宽度、填充字符和浮点数精度。

#include <iostream>
#include <iomanip> // 包含iomanip库以使用格式化功能int main() {double pi = 3.14159265358979323846;std::cout << "Pi is approximately: " << std::setprecision(5) << pi << std::endl; // 设置精度为5std::cout << std::setw(10) << std::setfill('*') << 25 << std::endl; // 设置宽度为10,不足部分用*填充return 0;
}

C++ 的 IOStream 库提供了一个高度灵活和强大的输入输出机制。通过学习使用这些基本的流对象和操作符,你可以轻松地在程序中实现复杂的数据输入输出操作。随着对 C++ 的深入学习,你将会接触到更多高级的 I/O 功能,包括文件操作、流的状态检查和错误处理等。

面向对象编程

对象、构造函数和析构函数、访问修饰符

面向对象编程(Object-Oriented Programming,OOP)是 C++ 的核心特性之一,它允许程序员使用类(class)和对象(object)来模拟现实世界中的实体和行为。面向对象编程的主要概念包括封装、继承和多态。下面将深入讨论类和对象、构造函数和析构函数、以及访问修饰符这几个基本概念。

类和对象

  • 类(Class):类是一个蓝图或模板,定义了一组具有共同属性和行为的对象的结构和功能。它包含了数据成员(属性)和成员函数(方法)。

  • 对象(Object):对象是根据类定义创建的实例。每个对象都拥有类中定义的属性和方法。对象的创建称为实例化。

class Car {
public:std::string color;void drive() {std::cout << "Driving" << std::endl;}
};int main() {Car myCar; // 创建 Car 类的对象 myCarmyCar.color = "Red"; // 访问属性myCar.drive(); // 调用方法return 0;
}

构造函数和析构函数

  • 构造函数(Constructor):构造函数是一种特殊的成员函数,它在对象被创建时自动调用。构造函数通常用于初始化对象的属性或执行对象创建时必需的其他操作。构造函数的名称与类名相同,且没有返回类型。

  • 析构函数(Destructor):析构函数也是一种特殊的成员函数,它在对象被销毁时自动调用。析构函数用于执行清理操作,如释放资源、关闭文件等。析构函数的名称是在类名前加上波浪符(~)。

class Car {
public:Car() { // 构造函数std::cout << "Car is being created" << std::endl;}~Car() { // 析构函数std::cout << "Car is being destroyed" << std::endl;}
};

访问修饰符

访问修饰符定义了类成员的访问权限。C++ 中主要有三种访问修饰符:

  • public:公有成员可以在类的外部被访问和修改。通常,构造函数和部分方法是公有的。
  • private:私有成员只能被类的内部(即类的其他成员函数)访问和修改,不能被类的外部访问。默认情况下,类的成员是私有的。
  • protected:受保护的成员与私有成员类似,但它们可以被继承类(子类)访问。
class Car {
private:std::string engineNumber; // 私有属性public:std::string color; // 公有属性void drive() { // 公有方法std::cout << "Driving" << std::endl;}
};

通过面向对象编程,C++ 允许开发者创建模块化和可重用的代码,这些代码能够更准确地模拟复杂的现实世界问题。理解类和对象、构造函数和析构函数以及访问修饰符的工作原理是学习面向对象编程的基础。掌握这些概念将帮助你更有效地使用 C++ 进行软件开发。

继承、多态和封装概念

继承、多态和封装是面向对象编程(OOP)的三大基本特性,C++ 作为一门支持面向对象的编程语言,也实现了这三个特性。它们使得 C++ 代码更加模块化、易于维护和扩展。下面将分别对这三个概念进行详细讲解:

封装(Encapsulation)

封装是面向对象编程中的一种将数据(属性)和行为(方法)组合为单一的类(class)单元,并限制对某些组件的直接访问的能力。

  • 目的:封装的主要目的是隐藏对象的内部细节,只对外暴露必要的操作接口。这样做的好处是能够减少系统的复杂性,并增加其可靠性和易于维护性。
  • 实现方式:在 C++ 中,封装通过将类成员声明为私有(private)或受保护(protected)来实现,这样这些成员就只能被类的方法或特定的友元类访问。
class Box {
private:double length; // 私有属性public:void setLength(double len) { // 公有方法,用于设置 length 的值length = len;}double getLength(void) { // 公有方法,用于获取 length 的值return length;}
};

继承(Inheritance)

继承允许我们根据另一个类来定义一个类,这样可以从已有的类继承数据和方法,使代码重用成为可能。

  • 目的:继承支持代码重用,可以创建一组按层次分类的类。它允许创建一个通用的类(基类),然后创建更专业的类(派生类)来继承其特性。
  • 实现方式:C++ 中通过 : 后跟访问修饰符(如 public)和基类名称来实现继承。
class Shape { // 基类
public:void setWidth(int w) {width = w;}void setHeight(int h) {height = h;}
protected:int width;int height;
};class Rectangle: public Shape { // 派生类
public:int getArea() { return (width * height); }
};

多态(Polymorphism)

多态性允许我们使用统一的接口来操作不同的基本数据类型或类对象。

  • 目的:多态的目的是允许同一个接口表示不同的底层形态(数据类型)。这意味着从基类继承的方法可以在派生类中有不同的实现。
  • 实现方式:C++ 通过使用虚函数(virtual 关键字声明的函数)实现多态。当一个类中声明了虚函数,任何继承该类的派生类可以重写该函数,以实现不同的行为。
class Shape {
public:virtual void draw() {std::cout << "Drawing a shape" << std::endl;}
};class Circle: public Shape {
public:void draw() override { // 重写 draw 方法std::cout << "Drawing a circle" << std::endl;}
};void drawShape(Shape& shape) { // 通过引用或指针调用函数,实现多态shape.draw();
}int main() {Shape shape;Circle circle;drawShape(shape); // 输出 "Drawing a shape"drawShape(circle); // 输出 "Drawing a circle"return 0;
}

综上所述,封装、继承和多态是实现面向对象程序设计的三个核心概念。它们使得 C++ 程序更加灵活、易于管理和扩展。

内存管理

动态内存分配、指针和引用的使用

C++ 提供了强大的内存管理能力,包括动态内存分配、指针和引用的使用。理解和掌握这些概念对于编写高效、可靠的 C++ 程序至关重要。

动态内存分配

在 C++ 中,动态内存分配允许程序在运行时请求内存,用于存储变量或对象,使用完毕后可以释放这些内存。这种机制提供了灵活的内存使用方式,特别是对于那些在编译时无法确定所需内存大小的情况。

  • new 和 delete 操作符new 用于在堆(heap)上分配内存,delete 用于释放这部分内存。
int* ptr = new int; // 分配一个整数的内存
*ptr = 5; // 在分配的内存中存储值 5
delete ptr; // 释放内存

      动态分配数组:可以使用 new 分配数组,并使用 delete[] 释放数组。

int* array = new int[10]; // 动态分配大小为 10 的整型数组
delete[] array; // 释放数组内存

指针

指针是存储另一个变量的内存地址的变量。通过指针,可以间接访问和操作内存中的数据。

  • 声明和使用指针
int var = 10;
int* ptr = &var; // ptr 存储了 var 的地址
*ptr = 20; // 通过指针修改 var 的值
  • 指针与动态内存:指针常用于动态内存管理,通过指针可以访问和操作动态分配的内存。

引用

引用是另一个变量的别名,它提供了另一种形式的间接访问。引用在创建时必须初始化,且一旦绑定到一个变量,就不能改变绑定到另一个变量。

  • 声明和使用引用
int var = 10;
int& ref = var; // ref 是 var 的引用
ref = 20; // 修改 ref 同样修改了 var

引用与函数参数:引用经常用作函数参数,允许在不传递对象副本的情况下修改传递给函数的实参。

void increment(int& value) {value++;
}

指针 vs 引用

  • 指针可以为空(null),而引用则必须绑定到有效的对象。
  • 指针可以在其生命周期内改变所指向的对象,而引用一旦初始化后就不能被改变指向。
  • 指针需要使用特殊的语法(*&)来访问或修改所指向的对象,引用则可以像普通变量一样使用。

小结

C++ 的内存管理、指针和引用是该语言强大功能的基础。通过动态内存分配,开发者可以高效利用资源;通过指针和引用,可以灵活地访问和操作内存。然而,这些功能也带来了复杂性和潜在的错误风险,如内存泄漏、野指针等,因此必须谨慎使用,确保正确地分配和释放内存。

RAII(资源获取即初始化)概念

RAII(Resource Acquisition Is Initialization)是一种在 C++ 中广泛应用的编程技术和设计哲学,主要用于自动管理资源(如动态分配的内存、文件句柄、网络连接等)的生命周期。RAII 的核心思想是将资源的生命周期与对象的生命周期绑定,通过对象的构造函数获取资源并初始化,通过对象的析构函数释放资源。

RAII 的工作原理

  1. 资源获取:当一个对象被创建时,它的构造函数会自动执行,RAII 倡导在构造函数中获取并初始化所有必要的资源。

  2. 资源释放:当对象的生命周期结束时(比如对象离开作用域),它的析构函数会自动被调用。RAII 通过在析构函数中释放对象持有的资源,确保资源使用完毕后被正确清理。

RAII 的优势

  • 防止资源泄漏:通过自动调用析构函数来释放资源,RAII 可以有效防止资源泄漏。
  • 异常安全:即使在代码执行过程中发生异常,由于对象析构的确定性,资源仍然可以被安全释放,避免了异常导致的资源泄漏。
  • 简化资源管理代码:开发者不需要显式地调用释放资源的代码,简化了资源管理的复杂性。

RAII 的实际应用

在 C++ 标准库中,许多容器和智能指针(如 std::vector, std::string, std::unique_ptr, std::shared_ptr)都遵循 RAII 原则,它们自动管理资源,使得开发者可以更加专注于业务逻辑而不是资源的分配和释放。

示例:使用智能指针管理动态分配的内存
#include <memory>
#include <iostream>class MyClass {
public:MyClass() { std::cout << "MyClass created\n"; }~MyClass() { std::cout << "MyClass destroyed\n"; }
};int main() {// 使用 std::unique_ptr 自动管理 MyClass 的实例std::unique_ptr<MyClass> myObject = std::make_unique<MyClass>();// 不需要手动删除 myObject,当 myObject 离开作用域时,其析构函数会自动被调用,资源得到释放return 0;
}

在这个例子中,std::unique_ptr 是一个智能指针,遵循 RAII 原则自动管理 MyClass 实例的生命周期。当 myObject 离开作用域时,MyClass 的析构函数会自动被调用,myObject 指向的动态分配的内存会被释放。

总结

RAII 是 C++ 中非常重要的内存管理和资源管理策略。通过智能地利用对象的构造函数和析构函数,RAII 可以帮助开发者避免资源泄漏、简化代码并提高程序的异常安全性。掌握 RAII 是提高 C++ 编码质量和效率的关键。

STL(标准模板库)

STL 容器( vector、map、set)

STL(Standard Template Library,标准模板库)是 C++ 的一个强大的库,提供了一组通用的模板类和函数,这些模板类和函数可以用来实现常见的数据结构和算法。STL 主要包括三大组件:容器(Containers)、算法(Algorithms)、迭代器(Iterators)。在这里,我们将重点介绍 STL 的几种基本容器:vectormapset

vector

std::vector 是一种序列容器,可以看作一个能够存储动态大小数组的模板类。vector 在尾部添加或删除元素非常高效,但在中间或开始插入或删除元素可能较慢,因为这可能需要移动现有元素。

  • 使用示例
#include <vector>
#include <iostream>int main() {std::vector<int> vec; // 创建一个空的 vectorvec.push_back(10); // 向 vector 中添加元素vec.push_back(20);std::cout << "vec: ";for(int i : vec) {std::cout << i << " "; // 遍历 vector 并打印元素}std::cout << std::endl;return 0;
}

map

std::map 是一种关联容器,以键值对的形式存储元素,其中每个键都是唯一的,且每个键映射到一个值。map 内部通常实现为红黑树,提供了对元素的有序存储和对键的快速查找能力。

  • 使用示例
#include <map>
#include <iostream>int main() {std::map<std::string, int> ageMap; // 创建一个空的 mapageMap["Alice"] = 30; // 向 map 中添加元素ageMap["Bob"] = 25;std::cout << "Bob's age: " << ageMap["Bob"] << std::endl; // 通过键访问并打印元素return 0;
}

set

std::set 也是一种关联容器,它存储唯一的元素,没有重复的值。set 的内部实现也是基于红黑树,保证了元素的有序性和快速查找。

  • 使用示例
#include <set>
#include <iostream>int main() {std::set<int> mySet; // 创建一个空的 setmySet.insert(10); // 向 set 中添加元素mySet.insert(20);mySet.insert(10); // 重复的元素不会被添加std::cout << "mySet: ";for(int elem : mySet) {std::cout << elem << " "; // 遍历 set 并打印元素}std::cout << std::endl;return 0;
}

总结

STL 的容器提供了强大而灵活的数据结构,以支持各种程序设计需求。vectormapset 是最常用的几种容器类型,它们各自有不同的用途和性能特点:

  • vector:动态数组,适用于需要频繁访问元素的场景。
  • map:键值对集合,适用于需要根据键快速查找值的场景。
  • set:唯一元素集合,适用于需要快速查找、插入和删除且不重复的元素的场景。

熟练使用这些容器将有助于提高编程效率和代码质量。

STL 迭代器、算法和函数对象

STL(Standard Template Library,标准模板库)是 C++ 中提供的一组模板类和函数,旨在提供常用的数据结构和算法。除了容器外,STL 还包括迭代器、算法和函数对象,这些组件共同构成了 STL 的核心。下面是对这些组件的详细讲解:

迭代器(Iterators)

迭代器是一种访问容器中元素的对象,它提供了一种方式来顺序访问容器中的元素,而不需要了解容器的内部结构。迭代器类似于指针,但是设计得更为通用。

  • 主要类型input iterators, output iterators, forward iterators, bidirectional iterators, 和 random access iterators
  • 用法示例
#include <vector>
#include <iostream>int main() {std::vector<int> vec{1, 2, 3, 4, 5};for(std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

算法(Algorithms)

STL 提供了一系列在容器上执行操作的模板函数,如排序、查找、复制、修改等。这些算法是通用的,可以用于不同类型的容器。

  • 主要功能:非修改序列操作(如 count, find),修改序列操作(如 copy, replace),排序和相关操作(如 sort, binary_search),以及数值算法(如 accumulate, partial_sum)。
  • 用法示例(使用算法对向量排序):
#include <vector>
#include <algorithm>
#include <iostream>int main() {std::vector<int> vec{4, 2, 5, 1, 3};std::sort(vec.begin(), vec.end()); // 对 vec 进行排序for(int elem : vec) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

函数对象(Function Objects, Functors)

函数对象是重载了函数调用操作符 () 的任何对象。STL 中的许多算法都可以接受函数对象作为参数,这允许程序员自定义操作行为。

  • 用途:自定义排序准则、执行复杂的条件检查等。
  • 用法示例(使用函数对象自定义排序准则):
#include <vector>
#include <algorithm>
#include <iostream>class Compare {
public:bool operator()(int a, int b) {return a < b; // 升序排序}
};int main() {std::vector<int> vec{4, 2, 5, 1, 3};std::sort(vec.begin(), vec.end(), Compare()); // 使用 Compare 函数对象for(int elem : vec) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

总结

STL 的迭代器、算法和函数对象是 C++ 中实现高效和灵活程序设计的重要工具。通过迭代器,可以抽象地访问容器中的元素;算法提供了一套广泛的操作容器的方法;而函数对象则允许自定义这些操作的行为。熟练地使用这些组件,可以极大地提高编程的效率和代码的复用性。

相关文章:

C++基础语法和概念

基本语法和数据类型 C 是一种高性能的编程语言&#xff0c;允许程序员对内存管理进行精细控制。了解 C 的基本语法和数据类型是学习这门语言的第一步。以下是一些基础概念的详细介绍&#xff1a; 基本语法 程序结构 一个基础的 C 程序通常包括一个或多个头文件引用、一个 m…...

Vue.js+SpringBoot开发海南旅游景点推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…...

mysql笔记:11. 性能优化

文章目录 概览查询速度优化1. 分析查询语句1.1 EXPLAIN1.2 DESCRIBE 2. 使用索引优化查询3. 优化子查询 数据库结构优化1. 分解表2. 建立中间表3. 增加冗余字段4. 优化插入速度4.1. MyISAM引擎表4.2. InnoDB引擎表 5. 分析表、检查表和优化表5.1. 分析表5.2. 检查表5.3. 优化表…...

基于Docker搭建Maven私服仓库(Linux)详细教程

文章目录 1. 下载镜像并启动容器2. 配置Nexus3. 配置本地Maven仓库 1. 下载镜像并启动容器 下载Nexus3镜像 docker pull sonatype/nexus3查看Nexus3镜像是否下载成功 docker images创建Nexus3的挂载文件夹 mkdir /usr/local/nexus-data && chown -R 200 /usr/local…...

IPSEC VPPN 实验

背景&#xff1a;FW1和FW2为双机热备 要求&#xff1a;在FW5和FW3之间建立一条IPSEC通道&#xff0c;保证10.0.2.0/24网段可以正常访问到192.168.1.0/24IPSEC VPPN实验配置 fw2配置 加密数据流 新建对应IKE...

基于单片机的视觉导航小车设计

目 录 摘 要 I Abstract II 引 言 1 1 总体方案设计 3 1.1 方案论证 3 1.2 项目总体设计 3 2 项目硬件设计 4 2.1 主控模块设计 4 2.1.1单片机选型 4 2.1.2 STM32F103RCT6芯片 4 2.2单片机最小系统电路 5 2.3电机驱动模块设计 7 2.4红外模块设计 8 2.5红外遥控模块设计 9 2.6超…...

Autosar教程-Mcal教程-GPT配置教程

3.3GPT配置、生成 3.3.1 GPT配置所需要的元素 GPT实际上就是硬件定时器,需要配置的元素有: 1)定时器时钟:定时器要工作需要使能它的时钟源 2)定时器分步:时钟源进到定时器后可以通过分频后再给到定时器 定时器模块选择:MCU有多个定时器模块,需要决定使用哪个定时器模块作…...

力扣--动态规划5.最长回文子串

class Solution { public:string longestPalindrome(string s) {// 获取输入字符串的长度int n s.size();// 如果字符串长度为1&#xff0c;直接返回原字符串&#xff0c;因为任何单个字符都是回文串if (n 1)return s;// 创建一个二维数组dp&#xff0c;用于记录子串是否为回…...

PokéLLMon 源码解析(一)

.\PokeLLMon\poke_env\concurrency.py # 导入必要的模块 import asyncio import atexit import sys from logging import CRITICAL, disable from threading import Thread from typing import Any, List# 在新线程中运行事件循环 def __run_loop(loop: asyncio.AbstractEvent…...

银河麒麟服务器操作系统V10【vnc配置多用户登录】

1.添加多用户&#xff08;规划kingbase使用5901窗口&#xff0c;root使用5903&#xff09;&#xff1b; adduser kingbase 2.配置文件&#xff1b; cp -rp /lib/systemd/system/vncserver.service /etc/systemd/system/vncserver:1.servicecp -rp /lib/systemd/system/vncse…...

Logseq电脑端+安卓端同步gitee或github

文章目录 0.初衷1.电脑端1.1 新建仓库1.2 克隆项目&#xff0c;生成秘钥1.3 添加图谱&#xff0c;选择文件目录&#xff0c;我是原本就有笔记&#xff0c;所以会如下所示。1.4 下载脚本文件1.5赋权限 &#xff08;windows可跳过&#xff09;1.6 修改脚本命令1.7 logseq设置同步…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit

1.问题描述 在App中供用户在地图上选择地址&#xff0c;目前在使用Map Kit结合geolocationManager逆地理编码时获取的地址信息描述不准确&#xff0c;希望能提供相应的Demo参考。 解决方案 Demo代码示例&#xff1a; getLocation() { let requestInfo: geoLocationManager.…...

【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 6

【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 6 文章目录 前言一、创建controller相关二、逻辑分析RRBotModularJoint类解析ros2_control.xacro解析三、测试运行测试forward_position_controller总结前言 本篇文章在上篇文章的基础上主要讲解双轴机器人驱…...

Learn OpenGL 07 摄像机

定义摄像机参数 glm::vec3 cameraPos glm::vec3(0.0f, 0.0f, 3.0f);//摄像机位置glm::vec3 cameraTarget glm::vec3(0.0f, 0.0f, 0.0f);glm::vec3 cameraDirection glm::normalize(cameraPos - cameraTarget);//摄像机方向&#xff0c;指向z轴正方向 glm::vec3 up glm::vec…...

Linux系统部署火狐浏览器结合内网穿透实现公网访问

目录 前言 1. 部署Firefox 2. 本地访问Firefox 3. Linux安装Cpolar 4. 配置Firefox公网地址 5. 远程访问Firefox 6. 固定Firefox公网地址 7. 固定地址访问Firefox 结语 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Linux系统…...

Elastic Stack--05--聚合、映射mapping

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.聚合(aggregations)基本概念桶&#xff08;bucket&#xff09;度量&#xff08;metrics&#xff09; 案例 11. 接下来按price字段进行分组&#xff1a;2. 若想对所…...

【嵌入式——QT】Model/View

【嵌入式——QT】Model/View 基本原理数据模型视图组件代理Model/View结构的一些概念QFileSystemModelQStringListModelQStandardItemModel自定义代理 基本原理 GUI应用程序的一个很重要的功能是由用户在界面上编辑和修改数据&#xff0c;典型的如数据库应用程序&#xff0c;数…...

向量化编程书籍推荐

文章目录 1. 书籍清单 1. 书籍清单 《Linear Algebra and Its Applications》 by Gilbert Strang 这本书是线性代数的经典教材&#xff0c;线性代数是向量化编程的基础。它涵盖了向量、矩阵、线性变换等内容&#xff0c;对理解向量化编程的数学概念非常有帮助《NumPy Beginner…...

算法D43 | 动态规划5 | 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

1049. 最后一块石头的重量 II 本题就和 昨天的 416. 分割等和子集 很像了&#xff0c;可以尝试先自己思考做一做。 视频讲解&#xff1a;动态规划之背包问题&#xff0c;这个背包最多能装多少&#xff1f;LeetCode&#xff1a;1049.最后一块石头的重量II_哔哩哔哩_bilibili 代…...

设计模式—桥接模式

定义: 桥接模式是将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。它是一种对象结构型模式&#xff0c;又称为柄体(Handle and Body)模式或接口(Interfce)模式。 本章代码:小麻雀icknn/设计模式练习 - Gitee.com 结构: 抽象化(Abstraction)角色&#xff1a…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...

GraphRAG优化新思路-开源的ROGRAG框架

目前的如微软开源的GraphRAG的工作流程都较为复杂&#xff0c;难以孤立地评估各个组件的贡献&#xff0c;传统的检索方法在处理复杂推理任务时可能不够有效&#xff0c;特别是在需要理解实体间关系或多跳知识的情况下。先说结论&#xff0c;看完后感觉这个框架性能上不会比Grap…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…...

虚幻基础:角色旋转

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 移动组件使用控制器所需旋转&#xff1a;组件 使用 控制器旋转将旋转朝向运动&#xff1a;组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转&#xff1a;必须移动才能旋转&#xff0c;不移动不旋转控制器…...