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

c++ 基础题目lambda

1. auto lambda = [](double x) { return static_cast<int>(x); }; 是 匿名函数对象 ,不可直接声明

a.可以赋值给一个与其类型兼容的 std::function 类型的对象 std::function<int(int, int)> lambda = [](int x, int y) { return x + y; };

 b.使用具体的 lambda 类型(函数指针) int (*lambda1)(int, int) = [](int x, int y) { return x + y; };

c. 推导类型decltype([](int x, int y) { return x + y; }) lambda = [](int x, int y) { return x + y; };

decltype 用于推导一个表达式的类型,而不是像 auto 那样推导变量的类型

int x = 5;
double y = 2.5;
decltype(x + y) z = x + y;  // decltype(x + y) 等同于 double
std::cout << z << std::endl;  // 输出 7.5

2. 什么样的lambda不能复制给function

1. 捕获非复制对象的 lambda

std::unique_ptr<int> ptr = std::make_unique<int>(42);

    // 捕获了一个不可复制的对象 std::unique_ptr
    auto lambda = [ptr]() { return *ptr; };

std::unique_ptr<int> 是不可复制的,它的移动语义导致 lambda 无法被复制。因此,std::function 也无法复制该 lambda ,可以改为捕获指针或其他可复制的对象。

auto lambda = [ptr = std::move(ptr)]() { return *ptr; };

2.捕获了外部局部变量,并且该变量是不可复制的(例如,捕获了一个带有删除拷贝构造函数的类型),就不能将其赋值给 std::function

#include <iostream>
#include <functional>

struct NonCopyable {
    NonCopyable() = default;
    NonCopyable(const NonCopyable&) = delete;  // 删除拷贝构造函数
};

int main() {
    NonCopyable nc;
    auto lambda = [nc]() { return 42; };  // 捕获了一个不可复制的对象

    // 无法将 lambda 赋值给 std::function,因为它捕获了不可复制的对象
    std::function<int()> func = lambda;  // 编译错误

  

3 . lambda 捕获的对象存在哪里

是由编译器在内存中为 lambda 创建的闭包对象所持有的。具体来说,lambda 捕获的对象被存储在一个类的成员变量中,这个类通常被称为闭包类型。

class lambda_class {
private:
    int x;  // 捕获的对象

public:
    lambda_class(int x) : x(x) {}
    void operator()() {
        std::cout << "Captured value: " << x << std::endl;
    }
};

int main() {
    int x = 10;
    lambda_class lambda(x);  // 创建 lambda 对象
    lambda();  // 调用 lambda
    return 0;
}

lua 有几种原表

__index。用于访问表中不存在的字段时触发。可以用来实现表的继承或委托

__newindex  用于设置表中不存在的字段时触发。可以用于限制或控制表字段的赋值。

__call  当表被作为函数调用时触发。这允许你让表表现得像函数一样。

__tostring 当表被转换为字符串时触发。通常在使用 print() 或 tostring() 函数时,Lua 会调用 __tostring 元方法。

__add, __sub, __mul, __div, __mod, __pow, __concat, __len, __eq, __lt, __le 等运算符元方法

5. realloc 会尝试调整内存块的大小:

  • 扩展内存

    • 如果当前内存块后面有足够的空闲空间,realloc 会直接扩展内存块,而无需移动数据。

    • 如果没有足够的空闲空间,realloc 会分配一块新的内存,将原有数据复制到新内存中,然后释放旧内存。

6. 在 MySQL 中,"回表"(也叫做"二次查表")是指在使用覆盖索引时,如果查询需要的字段不在索引中,那么就需要通过索引中的记录再次去查询对应的数据表,从而获取那些没有包含在索引中的字段值。

为了更好理解,先简要了解下 MySQL 索引的相关概念:

  1. 覆盖索引:是指查询时,所需要的所有字段都在索引中,查询不需要再访问数据表(即回表操作)。
  2. 非覆盖索引:是指查询需要的字段不完全在索引中,部分数据仍然需要通过索引中的主键或唯一索引回到数据表中查找。

举个例子

假设 users 表有如下字段:id(主键)、nameage,并且你创建了一个索引 idx_name,仅包含 name 字段。如果你执行以下查询:

ELECT id, name, age FROM users WHERE name = 'Alice'; 
  1. MySQL 会首先利用 idx_name 索引查找符合条件的记录(即 name = 'Alice')。
  2. 由于查询还需要 id 和 age 字段,而这些字段不包含在 idx_name 索引中,因此 MySQL 会通过索引中的主键值回到数据表中,查找对应的行数据并返回结果。

怎么避免回表

1. 使用覆盖索引

CREATE INDEX idx_name_age ON users(name, age);

2. 使用复合索引

如果查询涉及多个字段,最好创建一个复合索引,索引包含查询的所有字段,避免 MySQL 在查询过程中回表。

示例:

假设你频繁查询 nameage 字段,可以创建如下复合索引:

CREATE INDEX idx_name_age ON users(name, age);

当你执行以下查询时:

SELECT name, age FROM users WHERE name = 'Alice' AND age = 25;

MySQL 会使用复合索引 idx_name_age,通过索引直接返回数据,避免回表。

3. 合理选择查询字段

4.  使用主键查询

8. 模版是拷贝代码的.

#include <iostream>

template <typename T>
class t {
public:
    static int staticVar;  // 静态成员变量
    T a;
};
// 静态成员变量的定义
template <typename T>
int t<T>::staticVar = 0;

int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, World!\n";
    
    t<float> c;
    c.staticVar = 99;
    
    t<int> b;
    b.staticVar = 100;
 
    printf("%d \n", c.staticVar);
    return 0;
}

互斥锁在父子进程中也是独立的,锁了的状态也会被复制,,需要在各自的进程解锁

#include <iostream>


#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

pthread_mutex_t mutex;  // 定义互斥锁

int main() {
    pid_t pid;

    // 初始化互斥锁
    pthread_mutex_init(&mutex, NULL);

    // 父进程锁定互斥锁
    pthread_mutex_lock(&mutex);
    printf("Parent process: Mutex locked.\n");

    // 使用 fork 创建子进程
    pid = fork();

    if (pid == -1) {
        // 错误处理
        perror("fork failed");
        exit(1);
    }

    if (pid == 0) {  // 子进程
        // 子进程在这里会等到父进程锁定互斥锁
        printf("Child process: Waiting to unlock the mutex...\n");
        // 子进程解锁互斥锁
        pthread_mutex_unlock(&mutex);
        printf("Child process: Mutex unlocked.\n");
        exit(0);
    } else {  // 父进程
        // 父进程在这里等待子进程执行完毕
        wait(NULL);  // 等待子进程结束
        printf("Parent process: Mutex still locked after child exits.\n");

        // 父进程完成任务后解锁互斥锁
        pthread_mutex_unlock(&mutex);
        printf("Parent process: Mutex unlocked.\n");

        // 销毁互斥锁
        pthread_mutex_destroy(&mutex);
    }

    return 0;
}

相关文章:

  • C++学习之路,从0到精通的征途:类和对象(下)
  • C++ STL 之常用排序算法①sort②random_shuffle③merge④reverse
  • Git 回退操作详解:带示例的“小白”指南
  • 6k ± 1 规则
  • 考研数学二:函数、极限与连续知识架构与易错点全解析
  • 性能测试-负载测试平台 Artillery
  • 我的Gitee
  • 2025.3.17总结
  • 图 最 短 路
  • 数组题型-二分查找-JS
  • 【SpringCloud】Eureka、LoadBalancer和Nacos
  • 点阵取模中的字节正序和字节倒序
  • c++基础知识-图论进阶
  • ChatGPT智能聊天机器人实现
  • 【函数式编程】【C#/F#】第四讲:单子与函子 - 抽象的编程模式
  • 重生之我在学Vue--第18天 Vue 3 项目功能扩展
  • “Failed to Load SteamUI.dll” 错误详解:全面解析与高效解决方案,助你快速修复 Steam 客户端问题
  • React 18 并发更新的工作原理与实战应用
  • 【软件工程】06_软件设计
  • AI学习第二天--监督学习 半监督学习 无监督学习
  • “75万买299元路由器”事件进展:重庆市纪委等三部门联合介入调查
  • 日本广岛大学一处拆迁工地发现疑似未爆弹
  • 雷军:过去一个多月是创办小米以来最艰难的时间
  • 巴西总统卢拉将访华
  • 人民日报钟声:平等对话是解决大国间问题的正确之道
  • 深圳两家会所涉卖淫嫖娼各被罚7万元逾期未缴,警方发催告书