首页 > 编程语言 >Rust和C++在游戏开发过程中会有怎样的区别,快来看看吧,有具体案例哦!!!

Rust和C++在游戏开发过程中会有怎样的区别,快来看看吧,有具体案例哦!!!

时间:2024-11-14 19:18:29浏览次数:3  
标签:dynamicsWorld color C++ let new Rust 中会

Rust 作为一种系统级编程语言,以其性能、安全性和并发处理能力著称,在游戏开发中找到了越来越多的应用场景。

首先说一下Rust在游戏开发的场景应用有哪些

以下是 Rust 在游戏开发中的几个主要应用方向:

1. 游戏引擎开发

  • Amethyst: 这是一个完全用 Rust 编写的游戏引擎,专注于易用性和灵活性。Amethyst 支持 2D 和 3D 游戏开发,提供了 ECS (Entity Component System) 架构,以及对物理、动画、音频和渲染的支持。

2. 图形和渲染

虽然 Rust 在图形渲染领域的应用不如 C++ 那么广泛,但是已经有一些项目开始探索使用 Rust 进行图形编程。例如:

  • Luminance: 一个专注于现代图形 API 的 Rust 库,可以用来构建高性能的图形应用程序。
  • Vulkan Bindings: Rust 社区为 Vulkan 图形和计算 API 提供了绑定,允许开发者直接使用 Rust 访问 Vulkan 功能。

3. 物理模拟

  • nphysics: 如前所述,这是一个用 Rust 编写的物理模拟库,适合用于需要精确物理模拟的游戏开发。

4. 网络通信

  • Rust 的异步 I/O 模型非常适合开发高效的网络服务。对于多人在线游戏来说,使用 Rust 可以构建稳定、高效的后端服务器。
  • Tokio: 是一个流行的异步运行时库,常用于构建高性能的网络应用程序和服务。

5. 工具链开发

  • 使用 Rust 开发游戏开发工具也是一个重要的应用领域,包括但不限于资源编译器、场景编辑器、数据转换工具等。
  • Cargo: Rust 的包管理和构建工具,可以方便地集成到游戏开发流程中,简化依赖管理和构建过程。

6. 性能关键部分的优化

  • 对于一些大型游戏,尤其是那些需要极高性能的部分(如复杂的物理计算、AI 行为等),可以用 Rust 重写这些部分以获得更好的性能。

除了上述两个方面外,Rust 在游戏开发中的其他应用场景还包括但不限于:

  • 图形渲染:虽然目前直接用 Rust 编写的成熟图形引擎还不多见,但已经有项目尝试利用 Rust 构建图形管线或作为现有图形库的绑定语言。
  • 网络通信:对于需要强大网络功能的游戏(如 MMO 游戏),Rust 的异步编程模型和安全性优势可以显著提高开发效率和系统稳定性。
  • 工具链开发:游戏开发过程中经常需要用到各种辅助工具,比如资源打包器、地图编辑器等,这些工具同样可以从 Rust 的高性能和现代特性中受益。

接下来就进入实战演练(Rust)

以下是一些具体的实例,展示了 Rust 在游戏开发中的实际应用:

1. 游戏引擎 - Amethyst

Amethyst 是一个用 Rust 编写的游戏引擎,它提供了一套完整的工具和框架,帮助开发者快速构建游戏。以下是一个简单的 Amethyst 示例,展示如何创建一个基本的游戏窗口并显示一个精灵(Sprite)。

安装 Amethyst

首先,确保你已经安装了 Rust 和 Cargo。然后,通过 Cargo 创建一个新的项目并添加 Amethyst 依赖:

[dependencies]
amethyst = "0.15"
示例代码
use amethyst::{
    assets::{Loader, AssetStorage},
    core::transform::Transform,
    prelude::*,
    renderer::{
        plugins::{RenderFlat2D, RenderToWindow},
        types::DefaultBackend,
        RenderingBundle,
    },
    utils::application_root_dir,
};

struct MyState;

impl SimpleState for MyState {
    fn on_start(&mut self, data: StateData<'_, GameData<'_, '_>>) {
        let world = data.world;
        let loader = world.read_resource::<Loader>();

        // 加载纹理
        let texture_handle = loader.load("texture/your_texture.png", (), &world.read_resource());

        // 创建精灵
        let mut transform = Transform::default();
        transform.set_translation_xyz(100.0, 100.0, 0.0);

        world
            .create_entity()
            .with(texture_handle.clone())
            .with(transform)
            .build();
    }
}

fn main() -> amethyst::Result<()> {
    amethyst::start_logger(Default::default());

    let app_root = application_root_dir()?;
    let display_config_path = app_root.join("config").join("display.ron");

    let game_data = GameDataBuilder::default()
        .with_bundle(RenderingBundle::<DefaultBackend>::new()
            .with_plugin(RenderToWindow::from_config_path(display_config_path)?
                .with_dimensions(1024, 768))
            .with_plugin(RenderFlat2D::default()))?;

    let mut game = Application::new(app_root.join("assets"), MyState, game_data)?;
    game.run();

    Ok(())
}

2. 物理模拟 - nphysics

nphysics 是一个用 Rust 编写的物理模拟库。以下是一个简单的示例,展示如何使用 nphysics 创建一个基本的物理世界并添加一个球体。

添加依赖

Cargo.toml 中添加 nphysics 依赖:

[dependencies]
nphysics = "0.15"
示例代码
use nphysics2d::object::{BodyPartHandle, ColliderDesc, RigidBodyDesc};
use nphysics2d::vectors::Vector2;
use nphysics2d::world::World;
use nphysics2d::math::{Point, Isometry};

fn main() {
    // 创建物理世界
    let mut world = World::new();
    world.set_gravity(Vector2::new(0.0, -9.81));

    // 创建地面
    let ground_size = 50.0;
    let ground_shape = ncollide2d::shape::Cuboid::new(Vector2::new(ground_size, 0.1));
    let ground_body = RigidBodyDesc::new().translation(Vector2::y() * -ground_size / 2.0).build(&mut world);
    let _ground_handle = ColliderDesc::new(ground_shape)
        .build(BodyPartHandle(ground_body.handle(), 0));

    // 创建球体
    let ball_radius = 0.5;
    let ball_shape = ncollide2d::shape::Ball::new(ball_radius);
    let ball_body = RigidBodyDesc::new().translation(Vector2::y() * 10.0).build(&mut world);
    let _ball_handle = ColliderDesc::new(ball_shape)
        .density(1.0)
        .build(BodyPartHandle(ball_body.handle(), 0));

    // 模拟物理世界
    for _ in 0..100 {
        world.step(&Vector2::new(0.0, -9.81), 0.016);
    }

    // 输出球体的位置
    let ball_position = world
        .rigid_body_part(BodyPartHandle(ball_body.handle(), 0))
        .unwrap()
        .position();
    println!("Ball position: {:?}", ball_position.translation.vector);
}

3. 图形渲染 - Luminance

Luminance 是一个用 Rust 编写的现代图形库,支持 OpenGL 和 Vulkan。以下是一个简单的 Luminance 示例,展示如何创建一个窗口并绘制一个三角形。

添加依赖

Cargo.toml 中添加 luminance 依赖:

[dependencies]
luminance = "0.36"
luminance-gl = "0.36"
示例代码
use luminance::blending::{Blending, Equation, Factor};
use luminance::context::Context;
use luminance::framebuffer::Framebuffer;
use luminance::pipeline::PipelineState;
use luminance::render_state::RenderState;
use luminance::shading::Program;
use luminance::surface::Surface;
use luminance::tess::{Mode, Tess};
use luminance::texture::{Dim2, GenMipmaps, Sampler, Texel, Texture};
use luminance::window::{Event, Window, WindowDim, WindowOpt};
use luminance_gl::GL33;

fn main() {
    let window_dim = WindowDim::Windowed(800, 600);
    let back_color = [0.1, 0.1, 0.1, 1.0];

    let surface = Surface::<GL33>::new(WindowOpt {
        dim: window_dim,
        ..WindowOpt::default()
    })
    .expect("cannot create surface");

    let context = surface.context();
    let mut window = surface.window();

    let program = Program::<GL33, (), ()>::from_strings(None, VS, None, FS)
        .expect("failed to build the program")
        .ignore_warnings();

    let tess = context
        .new_tess()
        .set_mode(Mode::Triangle)
        .set_vertices(&[
            Vertex {
                pos: [-0.5, -0.5],
                color: [1.0, 0.0, 0.0, 1.0],
            },
            Vertex {
                pos: [0.0, 0.5],
                color: [0.0, 1.0, 0.0, 1.0],
            },
            Vertex {
                pos: [0.5, -0.5],
                color: [0.0, 0.0, 1.0, 1.0],
            },
        ])
        .build()
        .expect("failed to build the tessellation");

    while !window.is_closed() {
        for event in window.poll_events() {
            if let Event::Close = event {
                return;
            }
        }

        let mut framebuffer = Framebuffer::back_buffer(&context);

        context.pipeline(&mut framebuffer, &PipelineState::default(), |_, mut shd_gate| {
            shd_gate.render(RenderState::default(), |mut rdr_gate| {
                rdr_gate.render_tess(&program, &tess, ());
            });
        });

        window.gl_swap_buffers();
    }
}

#[derive(Copy, Clone)]
struct Vertex {
    pos: [f32; 2],
    color: [f32; 4],
}

const VS: &'static str = r#"
#version 330
in vec2 pos;
in vec4 color;
out vec4 frag_color;
void main() {
    gl_Position = vec4(pos, 0.0, 1.0);
    frag_color = color;
}
"#;

const FS: &'static str = r#"
#version 330
in vec4 frag_color;
out vec4 out_color;
void main() {
    out_color = frag_color;
}
"#;

4. 网络通信 - Tokio

Tokio 是一个异步运行时库,非常适合用于开发高效的网络服务。以下是一个简单的 Tokio 示例,展示如何创建一个 TCP 服务器。

添加依赖

Cargo.toml 中添加 Tokio 依赖:

[dependencies]
tokio = { version = "1", features = ["full"] }
示例代码
use tokio::net::TcpListener;
use tokio::io::{AsyncReadExt, AsyncWriteExt};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let listener = TcpListener::bind("127.0.0.1:6142").await?;
    println!("Listening on 127.0.0.1:6142");

    loop {
        let (mut socket, _) = listener.accept().await?;

        tokio::spawn(async move {
            let mut buf = [0; 1024];

            loop {
                let n = match socket.read(&mut buf).await {
                    Ok(n) if n == 0 => return,
                    Ok(n) => n,
                    Err(e) => {
                        eprintln!("Failed to read from socket; err = {:?}", e);
                        return;
                    }
                };

                // Echo the received data back to the client
                if let Err(e) = socket.write_all(&buf[..n]).await {
                    eprintln!("Failed to write to socket; err = {:?}", e);
                    return;
                }
            }
        });
    }
}

那这个案例用C++怎么写呢(C++)

将上述 Rust 代码中的几个示例转换为 C++ 代码

示例 1: 游戏引擎 - Amethyst (用 SDL2 + OpenGL 替代)

C++ 示例代码
#include <SDL.h>
#include <GL/glew.h>
#include <iostream>

// 初始化 SDL 和 OpenGL
bool init() {
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        std::cerr << "SDL could not initialize! SDL_Error: " << SDL_GetError() << std::endl;
        return false;
    }

    SDL_Window* window = SDL_CreateWindow("SDL2 + OpenGL",
                                          SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
                                          800, 600, SDL_WINDOW_OPENGL);
    if (!window) {
        std::cerr << "Window could not be created! SDL_Error: " << SDL_GetError() << std::endl;
        return false;
    }

    SDL_GLContext glContext = SDL_GL_CreateContext(window);
    if (!glContext) {
        std::cerr << "OpenGL context could not be created! SDL_Error: " << SDL_GetError() << std::endl;
        return false;
    }

    glewExperimental = GL_TRUE;
    if (glewInit() != GLEW_OK) {
        std::cerr << "GLEW could not be initialized!" << std::endl;
        return false;
    }

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

    return true;
}

// 渲染循环
void render() {
    glClear(GL_COLOR_BUFFER_BIT);

    glBegin(GL_TRIANGLES);
    glColor3f(1.0, 0.0, 0.0); glVertex2f(-0.5, -0.5);
    glColor3f(0.0, 1.0, 0.0); glVertex2f(0.0, 0.5);
    glColor3f(0.0, 0.0, 1.0); glVertex2f(0.5, -0.5);
    glEnd();

    SDL_GL_SwapWindow(window);
}

int main(int argc, char* argv[]) {
    SDL_Window* window = nullptr;
    SDL_GLContext glContext = nullptr;

    if (!init()) {
        return -1;
    }

    bool running = true;
    SDL_Event event;

    while (running) {
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                running = false;
            }
        }

        render();
    }

    SDL_GL_DeleteContext(glContext);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}

示例 2: 物理模拟 - nphysics (用 Bullet Physics 替代)

C++ 示例代码
#include <btBulletDynamicsCommon.h>
#include <iostream>

void setupPhysics(btDiscreteDynamicsWorld*& dynamicsWorld) {
    // 创建碰撞配置
    btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
    btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);

    // 创建近似对
    btBroadphaseInterface* overlappingPairCache = new btDbvtBroadphase();

    // 创建约束解算器
    btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;

    // 创建物理世界
    dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, overlappingPairCache, solver, collisionConfiguration);
    dynamicsWorld->setGravity(btVector3(0, -9.81, 0));
}

void createGround(btDiscreteDynamicsWorld* dynamicsWorld) {
    btTransform groundTransform;
    groundTransform.setIdentity();
    groundTransform.setOrigin(btVector3(0, -0.5, 0));

    btScalar mass = 0;
    btVector3 inertia(0, 0, 0);

    btDefaultMotionState* groundMotionState = new btDefaultMotionState(groundTransform);
    btRigidBody::btRigidBodyConstructionInfo groundRigidBodyCI(mass, groundMotionState, new btStaticPlaneShape(btVector3(0, 1, 0), 0), inertia);
    btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI);

    dynamicsWorld->addRigidBody(groundRigidBody);
}

void createSphere(btDiscreteDynamicsWorld* dynamicsWorld) {
    btTransform sphereTransform;
    sphereTransform.setIdentity();
    sphereTransform.setOrigin(btVector3(0, 10, 0));

    btScalar mass = 1.0;
    btVector3 inertia(0, 0, 0);
    btSphereShape* sphereShape = new btSphereShape(0.5);
    sphereShape->calculateLocalInertia(mass, inertia);

    btDefaultMotionState* sphereMotionState = new btDefaultMotionState(sphereTransform);
    btRigidBody::btRigidBodyConstructionInfo sphereRigidBodyCI(mass, sphereMotionState, sphereShape, inertia);
    btRigidBody* sphereRigidBody = new btRigidBody(sphereRigidBodyCI);

    dynamicsWorld->addRigidBody(sphereRigidBody);
}

int main() {
    btDiscreteDynamicsWorld* dynamicsWorld = nullptr;

    setupPhysics(dynamicsWorld);
    createGround(dynamicsWorld);
    createSphere(dynamicsWorld);

    for (int i = 0; i < 100; ++i) {
        dynamicsWorld->stepSimulation(1.0 / 60.0, 10);
    }

    btVector3 spherePosition = dynamicsWorld->getRigidBody(1)->getCenterOfMassPosition();
    std::cout << "Sphere position: (" << spherePosition.x() << ", " << spherePosition.y() << ", " << spherePosition.z() << ")" << std::endl;

    // 清理资源
    delete dynamicsWorld->getCollisionObjectArray()[1]->getCollisionShape();
    delete dynamicsWorld->getCollisionObjectArray()[1]->getMotionState();
    delete dynamicsWorld->getCollisionObjectArray()[1];
    delete dynamicsWorld->getCollisionObjectArray()[0]->getCollisionShape();
    delete dynamicsWorld->getCollisionObjectArray()[0]->getMotionState();
    delete dynamicsWorld->getCollisionObjectArray()[0];
    delete dynamicsWorld->getSolver();
    delete dynamicsWorld->getDispatchInfo();
    delete dynamicsWorld->getBroadphase();
    delete dynamicsWorld->getDispatcher();
    delete dynamicsWorld->getCollisionConfiguration();
    delete dynamicsWorld;

    return 0;
}

示例 3: 图形渲染 - Luminance (用 GLFW + OpenGL 替代)

C++ 示例代码
#include <GLFW/glfw3.h>
#include <iostream>

const char* vertexShaderSource = R"(
#version 330
in vec2 pos;
in vec4 color;
out vec4 frag_color;
void main() {
    gl_Position = vec4(pos, 0.0, 1.0);
    frag_color = color;
}
)";

const char* fragmentShaderSource = R"(
#version 330
in vec4 frag_color;
out vec4 out_color;
void main() {
    out_color = frag_color;
}
)";

unsigned int compileShader(unsigned int type, const char* source) {
    unsigned int shader = glCreateShader(type);
    glShaderSource(shader, 1, &source, nullptr);
    glCompileShader(shader);

    int success;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
    if (!success) {
        char infoLog[512];
        glGetShaderInfoLog(shader, 512, nullptr, infoLog);
        std::cerr << "ERROR::SHADER::COMPILATION_FAILED\n" << infoLog << std::endl;
    }

    return shader;
}

unsigned int createProgram(const char* vertexSource, const char* fragmentSource) {
    unsigned int program = glCreateProgram();
    unsigned int vs = compileShader(GL_VERTEX_SHADER, vertexSource);
    unsigned int fs = compileShader(GL_FRAGMENT_SHADER, fragmentSource);

    glAttachShader(program, vs);
    glAttachShader(program, fs);
    glLinkProgram(program);

    glDeleteShader(vs);
    glDeleteShader(fs);

    return program;
}

int main() {
    if (!glfwInit()) {
        std::cerr << "Failed to initialize GLFW" << std::endl;
        return -1;
    }

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    GLFWwindow* window = glfwCreateWindow(800, 600, "GLFW + OpenGL", nullptr, nullptr);
    if (!window) {
        std::cerr << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(window);
    gladLoadGLLoader((GLADloadproc)glfwGetProcAddress);

    float vertices[] = {
        -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f,
         0.0f,  0.5f, 0.0f, 1.0f, 0.0f, 1.0f,
         0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 1.0f
    };

    unsigned int VBO, VAO;
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);

    glBindVertexArray(VAO);

    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);

    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(2 * sizeof(float)));
    glEnableVertexAttribArray(1);

    unsigned int shaderProgram = createProgram(vertexShaderSource, fragmentShaderSource);

    while (!glfwWindowShouldClose(window)) {
        glClear(GL_COLOR_BUFFER_BIT);

        glUseProgram(shaderProgram);
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES, 0, 3);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);
    glDeleteProgram(shaderProgram);

    glfwDestroyWindow(window);
    glfwTerminate();

    return 0;
}

那这两种语言在游戏开发方面有什么区别呢,让我们来对比分析看看

优点
  1. 性能:

    • Rust: Rust 的零成本抽象和高效的内存管理使其在性能上与 C++ 相当,甚至在某些情况下更好。
    • C++: C++ 是一种成熟的语言,具有广泛的优化技术和工具,性能非常高。
  2. 安全性:

    • Rust: Rust 的所有权模型和类型系统提供了强大的内存安全保证,减少了常见的内存错误。
    • C++: C++ 依赖于手动内存管理,容易出现内存泄漏和野指针等问题。
  3. 并发:

    • Rust: Rust 的异步编程模型和 fearless concurrency 设计使得并发编程更加安全和高效。
    • C++: C++ 的并发编程需要更多的手动管理,容易出错。
  4. 生态系统:

    • Rust: Rust 的生态系统正在快速发展,但相比于 C++,仍然有许多成熟的游戏开发库和工具需要完善。
    • C++: C++ 拥有成熟且广泛的生态系统,许多知名游戏引擎(如 Unreal Engine 和 Unity)都是用 C++ 开发的。
  5. 学习曲线:

    • Rust: Rust 的学习曲线较陡峭,特别是对于初学者,需要理解所有权、生命周期等概念。
    • C++: C++ 的学习曲线也较陡峭,但有丰富的教程和文档支持。
缺点
  1. 成熟度:

    • Rust: Rust 在游戏开发领域的应用相对较少,许多游戏开发库和工具仍在发展中。
    • C++: C++ 在游戏开发领域有着悠久的历史,有大量的成熟库和工具可供选择。
  2. 社区和支持:

    • Rust: Rust 的社区正在快速增长,但相对于 C++,游戏开发相关的资源和支持仍然有限。
    • C++: C++ 拥有庞大的社区和丰富的资源,许多游戏开发者都有丰富的经验。
  3. 工具链:

    • Rust: Rust 的工具链(如 Cargo)非常现代化,但游戏开发相关的工具链仍在完善中。
    • C++: C++ 的工具链非常成熟,有许多专门针对游戏开发的工具和插件。

Rust 在游戏开发中的一些方面(如内存安全和并发编程)具有明显的优势,但在成熟度和生态系统方面仍需进一步发展。相比之下,C++ 在游戏开发领域有着更广泛的应用和成熟的生态系统。

标签:dynamicsWorld,color,C++,let,new,Rust,中会
From: https://blog.csdn.net/speaking_me/article/details/143778568

相关文章

  • 区块反转c++
    代码#include<iostream>#include<vector>usingnamespacestd;structnode{  intdata,next;}A[100001];vector<int>L,ans,E[100001];ints,n,a,t,k,mark,cnt,c;intmain(){  cin>>s>>n>>k;  for(......
  • C++玩转物联网:认识树莓派Pico
     在嵌入式编程的领域中,树莓派Pico、Arduino和ESP32都是广受欢迎的微控制器开发板,但它们在性能、功能和编程语言支持上各有特点。树莓派Pico是树莓派基金会推出的一款高性价比开发板,搭载了RP2040微控制器,支持标准的C++库,在初学者和爱好者中迅速流行。本文将带您了解树莓派Pico......
  • Rust ?(Rust错误传播运算符?)(用于简化错误处理,自动将错误从函数中返回)(可恢复错误Result<T
    文章目录Rust错误传播运算符:深入理解与应用1.错误处理的基础1.1`Result`枚举1.2`Option`枚举2.错误传播运算符(`?`)2.1基本语法2.2工作原理1.检查返回值2.提取`Ok`值2.3错误传播示例3.错误传播与自定义错误类型(没仔细看)3.1定义自定义错误类型3.2自定义......
  • Rust泛型系统类型推导原理(Rust类型推导、泛型类型推导、泛型推导)为什么在某些情况必须
    文章目录示例代码疑问:代码不是能知道我要打印的是`&[i32]`吗?为啥非得要我加了`:std::fmt::Debug`它才能编译通过?答1.**Rust泛型系统的类型推导**2.**为什么要加`T:std::fmt::Debug`**3.**编译器如何处理泛型和trait约束**4.**Rust为什么需要这种明确的约束**5......
  • 【C++】STL--queue、deque、priority的模拟实现和应用
    目录1、queue的介绍1.2queue的常规操作 2、queue的模拟实现 3、priority_queue(优先级队列)的介绍和实现3.1priority_queue的使用 3.2 priority_queue的应用 3.3 priority_queue的模拟实现4、deque4.1deque的原理介绍4.2deque的缺陷4.3 为什么选择deque作......
  • rust学习九.1-集合之向量
    一、纲要 定义 1.new  Vec::new(); 2.采用宏 vec![1,2,3]; 操作 0.读取  索引语法或者get方法,注意索引从0开始.vec[0]或者vec.get(0)          vec[i]不会改变所有权,但如果发生越界,则会导致程序终止          get(i)返回......
  • 代码随想录算法训练营第三十天| 452. 用最少数量的箭引爆气球 、435. 无重叠区间 、76
    452.用最少数量的箭引爆气球思路:以前做过最大不相交子序列的题,这次也是往这根据某一端排序的思路想的,排序后如下图,只需要维护一个公共序列的右边界r就可以了,下一次判断时,只需要判断子区间的左边是否小于r。这个题有点坑的是使用Arrays排序,如果使用昨天的方法:Arra......
  • C++ 编程基础(5)类与对象 | 5.8、面向对象五大原则
    文章目录一、面向对象五大原则1、单一功能(SingleResponsibilityPrinciple,SRP)2、开放封闭原则(Open/ClosedPrinciple,OCP)3、里氏替换原则(LiskovSubstitutionPrinciple,LSP)4、接口隔离原则(InterfaceSegregationPrinciple,ISP)5、依赖倒置原则(DependencyInversio......
  • C++ 编程基础(5)类与对象 | 5.7、友元
    文章目录一、友元1、友元函数1.1、声明友元函数1.2、友元函数的特性2、友元类2.1、声明友元类2.2、友元类的特性3、使用场景4、注意事项5、总结前言:在C++中,友元类和友元函数是一种特殊的访问控制机制,允许一个类授予另一个类或函数特殊的访问权限。通过使用友元......
  • 双边滤波器原理简述及C++实现
    双边滤波器原理简述及C++实现一、文章简介二、双边滤波器原理三、C++实现1、代码2、效果展示四、标准差的选取1、空间域标准差(sigmaSpace)2、值域标准差(sigmaColor)3、参数调试一、文章简介本文主要简述双边滤波器原理,尽可能通俗易懂,最后用C+......