C/C++ | 每日一练 (4)

news2025/2/27 4:30:51

💢欢迎来到张胤尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥

文章目录

  • C/C++ | 每日一练 (4)
    • 题目
    • 参考答案
      • 基础容器
        • 序列容器
          • `std::array`
          • `std::vector`
          • `std::deque`
          • `std::list`
          • `std::forward_list`
        • 关联容器
          • 有序关联容器
            • `std::set`
            • `std::map`
            • `std::multiset`
            • `std::multimap`
          • 无序关联容器
            • `std::unordered_set`
            • `std::unordered_map`
            • `std::unordered_multiset`
            • `std::unordered_multimap`
      • 容器适配器
        • `std::stack`
        • `std::queue`
        • `std::priority_queue`

C/C++ | 每日一练 (4)

题目

c++STL 常见容器有哪些?简述一下底层实现的原理。

参考答案

c++ 中根据容器的特点和结构分为如下两大类:

  • 基础容器
  • 容器适配器

下面基于以上列举的两大类型进行一一总结。

基础容器

c++ 标准库中,基础容器是构建其他容器(如容器适配器)的底层实现,它们提供了丰富的数据存储和管理功能。

基础容器主要分为两大类:序列容器和关联容器

序列容器

序列容器用于存储线性排列的元素,支持随机访问或顺序访问。它们的特点是元素的顺序由插入顺序决定。

c++ 标准库中提供的序列容器有:std::arraystd::vectorstd::dequestd::liststd::forward_list


std::array

c++11 引入的固定大小的序列容器,底层是静态数组。它的大小在编译时确定,因此不支持动态大小。

例如:

#include <iostream>
#include <array>

int main()
{
    std::array<int, 5> arr = {1, 2, 3, 4, 5};

    // 访问元素
    std::cout << arr[2] << std::endl; // 3

    // 修改元素
    arr[2] = 10;
    std::cout << arr[2] << std::endl; // 10

    // 因为 array 是固定大小的容器,不能动态增加、删除元素

    // 遍历
    for (int i : arr)
    {
        std::cout << i << " "; // 1 2 10 4 5
    }
    std::cout << std::endl;

    return 0;
}
std::vector

底层是基于动态数组实现,支持随机访问。它在内存中分配一块连续的空间来存储元素,当容器中的元素数量超过当前分配的空间时,会触发扩容机制,扩容因子根据不同的标准库实现有不同的大小,目前是存在1.5倍和2倍的大小。

例如:

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 访问元素
    std::cout << vec[2] << std::endl; // 3

    // 修改元素
    vec[2] = 10;
    std::cout << vec[2] << std::endl; // 10

    // 在末尾添加元素
    vec.push_back(6);
    std::cout << vec.back() << std::endl; // 6

    // 删除最后一个元素
    vec.pop_back();
    std::cout << vec.size() << std::endl; // 5

    // 遍历
    for (int i : vec)
    {
        std::cout << i << " "; // 1 2 10 4 5
    }
    std::cout << std::endl;

    return 0;
}
std::deque

std::deque的底层结构可以看作是一个指针数组,其中每个指针指向一个固定大小的缓冲区(称为块)。这些块组成了整个 std::deque的数据存储。通过这种结构,std::deque可以在头尾进行高效的插入和删除操作,同时也能提供快速的随机访问。

  • 指针数组std::deque 使用一个数组来存储指向各个数据块(缓冲区)的指针。这个指针数组是连续的,即指针存储在一个连续的数组中。
  • 数据块(缓冲区):每个指针指向一个固定大小的缓冲区,这些缓冲区用于实际存储数据。缓冲区中的数据是连续存储的,但是缓冲区之间在内存中可能不是连续的。其中每个数据块大小是 4096 / sizeof(T)(其中 T是存储的类型)

例如:

#include <iostream>
#include <deque>

int main()
{
    std::deque<int> dq = {1, 2, 3, 4, 5};

    // 访问元素
    std::cout << dq[2] << std::endl; // 3

    // 修改元素
    dq[2] = 10;
    std::cout << dq[2] << std::endl; // 10

    // 在头部和尾部添加元素
    dq.push_front(0);
    dq.push_back(6);
    std::cout << dq.front() << " and " << dq.back() << std::endl; // 0 and 6

    // 删除头部和尾部元素
    dq.pop_front();
    dq.pop_back();
    std::cout << dq.size() << std::endl; // 5

    // 遍历
    for (int i : dq)
    {
        std::cout << i << " "; // 1 2 10 4 5
    }
    std::cout << std::endl;

    return 0;
}
std::list

双向链表,每个元素包含一个数据域和两个指针(分别指向前后元素)。它不依赖连续的内存空间。std::list 的大小可以动态增加或减少,允许在常数时间内插入或删除元素(只需调整指针)。另外 std::list 不支持随机访问,访问元素时需要从链表头或尾开始遍历。

例如:

#include <iostream>
#include <list>

int main()
{
    std::list<int> lst = {1, 2, 3, 4, 5};

    // 访问第一个元素
    std::cout << lst.front() << std::endl; // 1

    // 修改第一个元素
    lst.front() = 10;
    std::cout << lst.front() << std::endl; // 10

    // 在头部和尾部添加元素
    lst.push_front(0);
    lst.push_back(6);
    std::cout << lst.front() << " and " << lst.back() << std::endl; // 0 and 6

    // 删除第一个和最后一个元素
    lst.pop_front();
    lst.pop_back();
    std::cout << lst.size() << std::endl; // 5

    // 遍历
    for (int i : lst)
    {
        std::cout << i << " "; // 10 2 3 4 5
    }
    std::cout << std::endl;

    return 0;
}
std::forward_list

单向链表,每个元素只包含一个数据域和一个指针(指向后元素),只能单向遍历。与 std::list 一样不依赖于连续的内存空间,可以在常数时间内操作元素(调整指针),也同样不支持随机访问,访问元素时需要从链表头或尾开始遍历。

例如:

#include <iostream>
#include <forward_list>

int main()
{
    std::forward_list<int> flst = {1, 2, 3, 4, 5};

    // 访问第一个元素
    std::cout << flst.front() << std::endl; // 1

    // 修改第一个元素
    flst.front() = 10;
    std::cout << flst.front() << std::endl; // 10

    // 在头部添加元素
    flst.push_front(0);
    std::cout << flst.front() << std::endl; // 0

    // 删除第一个元素
    flst.pop_front();
    std::cout << flst.front() << std::endl; // 10

    // 遍历
    for (int i : flst)
    {
        std::cout << i << " "; // 10 2 3 4 5
    }
    std::cout << std::endl;

    return 0;
}
关联容器

c++ 标准库中,关联容器是一类特殊的容器,用于存储键值对,并根据键的值自动组织数据。

c++ 标准库提供了两种主要的关联容器类型,如下所示:

  • 有序关联容器:std::setstd::mapstd::multisetstd::multimap
  • 无序关联容器:std::unordered_setstd::unordered_mapstd::unordered_multisetstd::unordered_multimap

有序关联容器
std::set

存储唯一的键,所有元素按照键的顺序自动排序。std::set 底层使用红黑树实现,因此具有高效的插入、删除和查找操作。

例如:

#include <iostream>
#include <set>

int main()
{
    std::set<int> mySet;

    // 增:插入元素
    mySet.insert(10);
    mySet.insert(20);
    mySet.insert(30);
    mySet.insert(20); // 重复元素不会插入

    // 查找元素
    auto it = mySet.find(20);
    if (it != mySet.end())
    {
        std::cout << *it << std::endl; // 20
    }
    else
    {
        std::cout << "Not found!" << std::endl;
    }

    // set 的键值不可直接修改,需要删除后重新插入
    mySet.erase(it);  // 删除元素
    mySet.insert(25); // 插入新值

    // 删除元素
    mySet.erase(30);

    // 遍历
    for (const auto &value : mySet)
    {
        std::cout << value << " "; // 10 25
    }
    std::cout << std::endl;

    return 0;
}
std::map

以键值对的形式存储数据,键唯一,并且所有元素都按键的顺序自动排序。std::map 底层使用红黑树实现,因此具有高效的插入、删除和查找操作。

例如:

#include <iostream>
#include <map>

int main()
{
    std::map<int, std::string> myMap;

    // 插入键值对
    myMap[1] = "one";
    myMap[2] = "two";
    myMap[3] = "three";

    // 通过键访问值
    std::cout << myMap[2] << std::endl; // two

    // 修改键对应的值
    myMap[2] = "TWO";
    std::cout << myMap[2] << std::endl; // TWO

    // 删除键值对
    myMap.erase(3);

    // 遍历

    // 1: one
    // 2: TWO
    
    // for (const auto &[key, value] : myMap)
    // {
    //     std::cout << key << ": " << value << std::endl;
    // }

    for (const auto &it : myMap)
    {
        std::cout << it.first << ": " << it.second << std::endl;
    }

    return 0;
}
std::multiset

用于存储多个键,允许重复元素,并且所有元素按照键的顺序自动排序。std::multiset 使用红黑树实现,因此具有高效的插入、删除和查找操作。

例如:

#include <iostream>
#include <set>

int main()
{
    std::multiset<int> myMultiSet;

    // 插入元素
    myMultiSet.insert(10);
    myMultiSet.insert(20);
    myMultiSet.insert(20);
    myMultiSet.insert(30);

    // 查找元素
    auto it = myMultiSet.find(20);
    if (it != myMultiSet.end())
    {
        std::cout << *it << std::endl; // 20
    }
    else
    {
        std::cout << "Not found!" << std::endl;
    }

    // multiset 的键值不可直接修改,需要删除后重新插入
    myMultiSet.erase(it);  // 删除一个元素
    myMultiSet.insert(25); // 插入新值

    // 删除所有值为20的元素
    myMultiSet.erase(20);

    // 遍历
    for (const auto &value : myMultiSet)
    {
        std::cout << value << " "; // 10 25 30
    }
    std::cout << std::endl;

    return 0;
}
std::multimap

以键值对的形式存储数据,允许重复元素,并且所有元素都按键的顺序自动排序。std::multimap 底层使用红黑树实现,因此具有高效的插入、删除和查找操作。

例如:

#include <iostream>
#include <map>

int main()
{
    std::multimap<int, std::string> myMultiMap;

    // 插入键值对
    myMultiMap.insert({1, "one"});
    myMultiMap.insert({2, "two"});
    myMultiMap.insert({2, "TWO"});
    myMultiMap.insert({3, "three"});

    // 查找键对应的值(可能有多个)
    auto range = myMultiMap.equal_range(2);
    for (auto it = range.first; it != range.second; ++it)
    {
        // two
        // TWO
        std::cout << it->second << std::endl;
    }

    // 修改某个键值对的值
    auto it = myMultiMap.find(2);
    if (it != myMultiMap.end())
    {
        it->second = "TWO MODIFIED";
    }

    // 删除某个键值对
    myMultiMap.erase(it);

    // 遍历
    // 1: one
    // 2: TWO
    // 3: three
    
    // for (const auto &[key, value] : myMultiMap)
    // {
    //     std::cout << key << ": " << value << std::endl;
    // }

    for (const auto &it : myMultiMap)
    {
        std::cout << it.first << ": " << it.second << std::endl;
    }

    return 0;
}
无序关联容器
std::unordered_set

用于存储唯一的键,所有元素不按特定顺序排序。std::unordered_set 底层使用哈希表实现,因此具有常数时间复杂度的插入、删除和查找操作。

例如:

#include <iostream>
#include <unordered_set>

int main()
{
    std::unordered_set<int> us;

    // 插入元素
    us.insert(1);
    us.insert(2);
    us.insert(3);

    // 查找元素
    auto it = us.find(2);
    if (it != us.end())
    {
        std::cout << *it << std::endl; // 2
    }
    else
    {
        std::cout << "Not found!" << std::endl;
    }

    // unordered_set 不支持直接修改键,只能删除后重新插入
    us.erase(it);
    us.insert(25);

    // 删除
    us.erase(1);

    // 遍历
    for (const auto &elem : us)
    {
        std::cout << elem << " "; // 25 3
    }
    std::cout << std::endl;

    return 0;
}
std::unordered_map

以键值对的形式存储数据,键唯一,并且所有元素都不按特定顺序排序。std::unordered_map 底层使用哈希表实现,因此具有常数时间复杂度的插入、删除和查找操作。

例如:

#include <iostream>
#include <unordered_map>
using namespace std;

int main()
{
    unordered_map<int, string> um;

    // 插入键值对
    um[1] = "one";
    um[2] = "two";
    um[3] = "three";

    // 通过键访问值
    std::cout << um[2] << std::endl; // two

    // 修改键对应的值
    um[2] = "TWO";
    std::cout << um[2] << std::endl; // TWO

    // 删除键值对
    um.erase(3);

    // 遍历
    for (const auto &pair : um)
    {
        // 2: TWO
        // 1: one
        cout << pair.first << ": " << pair.second << endl;
    }

    return 0;
}
std::unordered_multiset

用于存储键,允许相同的元素出现多次,所有元素不按特定顺序排序。std::unordered_multiset 底层使用哈希表实现,因此具有常数时间复杂度的插入、删除和查找操作。

例如:

#include <iostream>
#include <unordered_set>

int main()
{
    std::unordered_multiset<int> ums;

    // 插入元素
    ums.insert(1);
    ums.insert(2);
    ums.insert(2);
    ums.insert(3);

    // 查找元素
    auto range = ums.equal_range(2);
    std::cout << std::distance(range.first, range.second) << std::endl; // 2

    // unordered_multiset 不支持直接修改键,只能删除后重新插入
    ums.erase(1);
    ums.insert(10);

    // 删除所有值为2的元素
    ums.erase(2);

    // 遍历
    for (const auto &elem : ums)
    {
        std::cout << elem << " "; // 10 3
    }
    std::cout << std::endl;

    return 0;
}
std::unordered_multimap

以键值对的形式存储数据,允许相同的键值出现多次,每个键可以对应多个值(键值对),并且所有元素都不按特定顺序排序。std::unordered_multimap 底层使用哈希表实现,因此具有常数时间复杂度的插入、删除和查找操作。

例如:

#include <iostream>
#include <unordered_map>

int main()
{
    std::unordered_multimap<int, std::string> umm;

    // 插入键值对
    umm.insert({1, "one"});
    umm.insert({2, "two"});
    umm.insert({2, "TWO"});
    umm.insert({3, "three"});

    // 查找键对应的值(可能有多个)
    auto range = umm.equal_range(2);
    std::cout << distance(range.first, range.second) << std::endl; // 2
    for (auto it = range.first; it != range.second; ++it)
    {
        std::cout << it->second << " "; // TWO two
    }
    std::cout << std::endl;

    // 修改某个键值对的值
    auto it = umm.find(2);
    if (it != umm.end())
    {
        it->second = "TWO_UPDATED";
    }

    // 删除某个键值对
    umm.erase(3);

    // 遍历
    for (const auto &pair : umm)
    {
        // 2: TWO_UPDATED
        // 2: two
        // 1: one
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    return 0;
}

容器适配器

容器适配器是一种特殊的容器,它们基于标准容器(如std::vectorstd::dequestd::list等),通过封装和限制其接口来提供特定的抽象数据类型。容器适配器并不直接存储数据,而是通过底层容器来数据存储,并且只暴露部分功能,以满足特定的使用场景。

c++ 标准库中提供了三个容器适配器:std::stackstd::queuestd::priority_queue


std::stack

后进先出(LIFO)的数据结构,支持在栈顶插入和删除元素。默认基于 std::deque 实现,可以使用 std::vectorstd::list 作为底层容器

template<typename _Tp, typename _Sequence = deque<_Tp> >
class stack { 
	//...
}

例如:

#include <iostream>
#include <stack>
#include <vector>
#include <list>

int main()
{
    std::stack<int> s;

    // 使用 std::vector
    // std::stack<int, std::vector<int>> s1;
    
    // 使用 std::list
    // std::stack<int, std::list<int>> s2;

    // 插入元素
    s.push(1);
    s.push(2);
    s.push(3);

    // 查询栈顶元素
    std::cout << s.top() << std::endl; // 3

    // 弹出栈顶元素
    s.pop();
    std::cout << s.top() << std::endl; // 输出新栈顶元素的值    2

    // 判断栈是否为空
    if (!s.empty())
    {
        std::cout << "stack is not empty" << std::endl; // stack is not empty
    }

    // 获取栈的大小
    std::cout << s.size() << std::endl; // 2

    return 0;
}
std::queue

先进先出(FIFO)的数据结构,支持在队尾插入元素,在队头删除元素。默认基于 std::deque 实现,可以使用 std::list 作为底层容器

template<typename _Tp, typename _Sequence = deque<_Tp> >
class queue
{
    // ...
}

需要注意的是:std::vector 是一个动态数组,支持快速的尾部插入和删除操作(push_backpop_back),但不支持高效的头部删除操作(pop_front)。因此, std::vector 无法作为 std::queue 的底层容器。

例如:

#include <iostream>
#include <queue>
#include <list>

int main()
{
    std::queue<int> q;

    // 使用 std::list
    // std::queue<int, std::list<int>> q1;

    // 元素入队
    q.push(1);
    q.push(2);
    q.push(3);

    // 输出队头元素
    std::cout << q.front() << std::endl; // 1

    // 输出队尾元素
    std::cout << q.back() << std::endl; // 3

    // 元素出队
    q.pop();
    std::cout << q.front() << std::endl; // 2

    // 判断队列是否为空
    if (!q.empty())
    {
        std::cout << "queue is not empty" << std::endl; // queue is not empty
    }

    // 获取队列的大小
    std::cout << "queue size: " << q.size() << std::endl; // queue size: 2

    return 0;
}
std::priority_queue

优先队列,元素会按照优先级顺序排(默认是大顶堆,如果需要小顶堆,则需要自定义比较器)。默认基于 std::vector 作为底层容器,可以使用 std::deque 作为底层容器

template<typename _Tp, typename _Sequence = vector<_Tp>,
   typename _Compare  = less<typename _Sequence::value_type> >
class priority_queue
{
    // ...
}

需要注意的是:std::list 只支持双向迭代器,不支持随机访问。而优先队列需要上浮和下沉操作(需要随机访问的支持),所以 std::list 无法作为 std::priority_queue 的底层容器。

例如:

#include <iostream>
#include <queue>
#include <deque>

int main()
{
    std::priority_queue<int> pq;
    // std::priority_queue<int, std::deque<int>> pq;

    // 堆中插入元素
    pq.push(1);
    pq.push(3);
    pq.push(2);

    // 查询堆顶元素
    std::cout << pq.top() << std::endl; // 3

    // 删除堆顶元素
    pq.pop();
    std::cout << pq.top() << std::endl; // 2

    // 判断堆是否为空
    if (!pq.empty())
    {
        // priority queue is not empty
        std::cout << "priority queue is not empty" << std::endl; 
    }

    // 获取优先队列的大小
    // priority queue size: 2
    std::cout << "priority queue size: " << pq.size() << std::endl; 

    return 0;
}

🌺🌺🌺撒花!

如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2306685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯备考:贪心算法之矩阵消除游戏

这道题是牛客上的一道题&#xff0c;它呢和我们之前的排座位游戏非常之相似&#xff0c;但是&#xff0c;排座位问题选择行和列是不会改变元素的值的&#xff0c;这道题呢每每选一行都会把这行或者这列清零&#xff0c;所以我们的策略就是先用二进制把选择所有行的情况全部枚举…

基于 CFD 预测的机器学习第 2 部分:在 Benchmark 应用程序上使用 Stochos 预测流场

了解机器学习和 Stochos 如何彻底改变制造业的 CFD 预测。 挑战 预测复杂流体动力学场景中的流场一直是工程师和科学家面临的重大挑战。传统的计算流体动力学 &#xff08;CFD&#xff09; 方法需要大量的计算资源和时间&#xff0c;因此难以处理实时预测和大规模模拟。 此外…

批量导出数据库表到Excel

这篇文章将介绍如何批量的将多个甚至成千上万的数据库表导出为Excel文件。 准备数据 如下图是数据库里的表&#xff0c;我们需要将它们全部导出为excel文件&#xff0c;这里以SQL Server数据库为例 新增导出 打开的卢导表工具&#xff0c;新建数据库连接&#xff0c;这里以S…

力扣提升第一天

力扣提升第一天 题目链接&#xff1a;https://leetcode.cn/problems/design-memory-allocator/?envTypedaily-question&envId2025-02-25 一开始解题思路 暴力解决法 我奔着先从简单的写法做起&#xff0c;之后再想办法进行改进&#xff0c;心里已经预料到会出现超出时间…

uni-app 开发 App 、 H5 横屏签名(基于lime-signature)

所用插件&#xff1a;lime-signature 使用到 CSS 特性 绝对定位transform 旋转transform-origin transform 原点 复习一下定位元素&#xff08;相对定位、绝对定位、粘性定位&#xff09; 代码# <template><view class"signature-page"><view clas…

【Python】Python顺序语句经典题(四)

Python顺序语句经典练习题例题&#xff08;四&#xff09;。题目来源&#xff1a;Acwing 前三期合集&#xff1a;【Python】Python顺序语句经典题合集-CSDN博客 目录 1.最大值 题目描述 解题思路 AC代码 2.距离 题目描述 AC代码 3.燃料消耗 题目描述 AC代码 4.钞票…

03_pyqt5 + vlc 实现视频播放器

1.功能需求如图 按钮: 播放/暂停, 前进/后退, 视频上一个/下一个, 打开视频进度条: 视频进度条显示, 进度条拖拽, 音量控制按键控制: 1,2,3,4缩放画面大小, 2.方案选择 开发语言: python UI界面: pyqt5 qt_designed 设计ui布局 视频编码: python-vlc 方案说明: 视频解码可…

prometheus+node_exporter+grafana监控K8S信息

prometheusnode_exportergrafana监控K8S 1.prometheus部署2.node_exporter部署3.修改prometheus配置文件4.grafana部署 1.prometheus部署 包下载地址&#xff1a;https://prometheus.io/download/ 将包传至/opt 解压 tar xf prometheus-2.53.3.linux-amd64.tar.gz 移动到…

IDEA关闭SpringBoot程序后仍然占用端口的排查与解决

IDEA关闭SpringBoot程序后仍然占用端口的排查与解决 问题描述 在使用 IntelliJ IDEA 开发 Spring Boot 应用时&#xff0c;有时即使关闭了应用&#xff0c;程序仍然占用端口&#xff08;例如&#xff1a;4001 端口&#xff09;。这会导致重新启动应用时出现端口被占用的错误&a…

山东大学软件学院nosql实验三

实验题目&#xff1a; 用Java做简单查询(2学时) 实验内容 用API方式&#xff0c;做简单查询。 实验要求 在以下要求中选择至少2个&#xff0c;使用Java语言实现数据查询&#xff0c;最终把数据输出到前端界面。 &#xff08;1&#xff09;找出年龄小于20岁的所有学生 &…

零样本学习 zero-shot

1 是什么 2 如何利用零样本学习进行跨模态迁移&#xff1f; demo代码 安装clip pip install ftfy regex tqdm pip install githttps://github.com/openai/CLIP.git import torch import clip from PIL import Image# 加载 CLIP 模型 device "cuda" if torch.cuda.i…

《深度学习实战》第3集:循环神经网络(RNN)与序列建模

第3集&#xff1a;循环神经网络&#xff08;RNN&#xff09;与序列建模 引言 在深度学习领域&#xff0c;处理序列数据&#xff08;如文本、语音、时间序列等&#xff09;是一个重要的研究方向。传统的全连接网络和卷积神经网络&#xff08;CNN&#xff09;难以直接捕捉序列中…

mac下载MAMP6.8.1

因为mac的小皮面板没有php7.4了 链接&#xff1a;c9cc270e6961c17c.dmg官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 鹅选一 附上大佬写的教程&#xff1a;MAMP PRO教程 - 牛奔 - 博客园

BUU41 [GYCTF2020]FlaskApp1【SSTI】

题目&#xff1a; 加密处没啥事&#xff0c;但是解密的地方提交{{7*7}}就会返回报错界面&#xff0c;顺便把代码也爆出来了 text_decode base64.b64decode(text.encode()) 先将字符串 text编码为字节对象&#xff0c;然后使用 base64.b64decode 函数对这个字节对象进行 Base…

今日运维之-Mac笔记本python环境问题

1. 问题&#xff1a;MAC升级系统后git报错&#xff1f; Error: Cant create update lock in /usr/local/var/homebrew/locks! Fix permissions by running:sudo chown -R $(whoami) /usr/local/var/homebrew Traceback (most recent call last):11: from /usr/local/Homebrew/…

易基因:RNA甲基化修饰和R-loop的交叉调控:从分子机制到临床意义|深度综述

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 R-loop&#xff08;RNA-DNA杂合结构&#xff09;是转录调控、DNA复制和修复等关键细胞过程的重要组成部分。但R-loop异常积累可能会破坏基因组完整性&#xff0c;从而导致多种疾病的发生…

NLP的预处理数据

处理文本数据的主要工具是Tokenizer。Tokenizer根据一组规则将文本拆分为tokens。然后将这些tokens转换为数字&#xff0c;然后转换为张量&#xff0c;成为模型的输入。模型所需的任何附加输入都由Tokenizer添加。 如果您计划使用预训练模型&#xff0c;重要的是使用与之关联的…

Linux相关知识(文件系统、目录树、权限管理)和Shell相关知识(字符串、数组)

仅供自学&#xff0c;请去支持javaGuide原版书籍。 1.Linux 1.1.概述 Linux是一种类Unix系统。 严格来讲&#xff0c;Linux 这个词本身只表示 Linux内核&#xff0c;单独的 Linux 内核并不能成为一个可以正常工作的操作系统。所以&#xff0c;就有了各种 Linux 发行版&#…

7种内外网数据交换方案全解析 哪种安全、高效、合规?

内外网数据交换方案主要解决了企业跨网络数据传输中的安全、效率与合规性问题。通过采用先进的加密技术、高效的数据传输协议以及严格的审批和审计机制&#xff0c;该方案确保了数据在内外网之间的安全交换&#xff0c;同时提高了传输效率&#xff0c;并满足了企业对数据合规性…

基于 Python 的项目管理系统开发

基于 Python 的项目管理系统开发 一、引言 在当今快节奏的工作环境中&#xff0c;有效的项目管理对于项目的成功至关重要。借助信息技术手段开发项目管理系统&#xff0c;能够显著提升项目管理的效率和质量。Python 作为一种功能强大、易于学习且具有丰富库支持的编程语言&…