C++复习笔记--STL的string容器和vector容器

news2024/12/27 16:30:57

1--string容器

string 本质上是一个类,其不同于指针 char*,string 类的内部封装了 char*,用于管理字符串,是一个 char* 型的容器;

1-1--string构造函数

string 的构造函数原型:

string(); // 创建一个空的字符串
string(const char* s); // 使用字符串 s 进行初始化
string(const string& str); // 使用一个 string 对象初始化另一个 string 对象;
string(int n, char c); // 使用 n 个字符 c 进行初始化;

代码实例:

#include <iostream>
#include <string>
int main(int argc, char* argv[]){
    
    // string();  // 创建一个空的字符串
    std::string s1;

    // string(const char* s); // 使用字符串 s 进行初始化
    const char* str = "hello world";
    std::string s2(str);

    // string(const string& str); // 使用一个 string 对象初始化另一个 string 对象;
    std::string s3(s2);

    // string(int n, char c);  // 使用 n 个字符 c 进行初始化;
    std::string s4(10, 'a');

    std::cout << "s1: " << s1 << std::endl;
    std::cout << "s2: " << s2 << std::endl;
    std::cout << "s3: " << s3 << std::endl;
    std::cout << "s4: " << s4 << std::endl;

    return 0;
}
 

1-2--string赋值操作

string 赋值操作的函数原型:

string& operator=(const char* s); // 将 char* 类型的字符串赋值给当前字符串
string& operator=(const string &s); // 将字符串 s 赋给当前的字符串
string& operator=(char c); // 将字符 c 赋给当前的字符串
string& assign(const char *s); // 将字符串 s 赋给当前字符串
string& assign(const char *s, int n); // 将字符串 s 的前 n 个字符赋给当前的字符串
string& assign(const string &s); // 将字符串 s 赋给当前字符串
string& assign(int n, char c); // 将 n 个字符 c 赋给当前字符串

代码实例:

#include <iostream>
#include <string>
int main(int argc, char* argv[]){
    
    // string& operator=(const char* s); // 将 char* 类型的字符串赋值给当前字符串
    std::string str1;
    str1 = "hello world";
    std::cout << "str1 = " << str1 << std::endl;

    // string& operator=(const string &s); // 将字符串 s 赋给当前的字符串
    std::string str2;
    str2 = str1;
    std::cout << "str2 = " << str2 << std::endl;

    // string& operator=(char c); // 将字符 c 赋给当前的字符串
    std::string str3;
    str3 = 'a';
    std::cout << "str3 = " << str3 << std::endl;

    // string& assign(const char *s); // 将字符串 s 赋给当前字符串
    std::string str4;
    str4.assign("hello C++");
    std::cout << "str4 = " << str4 << std::endl;

    // string& assign(const char *s, int n); // 将字符串 s 的前 n 个字符赋给当前的字符串
    std::string str5;
    str5.assign("hello C++", 5);
    std::cout << "str5 = " << str5 << std::endl;

    // string& assign(const string &s); // 将字符串 s 赋给当前字符串
    std::string str6;
    str6.assign(str5);
    std::cout << "str6 = " << str6 << std::endl;

    // string& assign(int n, char c); // 将 n 个字符 c 赋给当前字符串
    std::string str7;
    str7.assign(10, 'w');
    std::cout << "str7 = " << str7 << std::endl;

    return 0;
}
 

1-3--string字符串拼接

string 实现在字符串末尾拼接字符串,其函数原型如下:

string& operator+=(const char* str); // 重载+=操作符来拼接
string& operator+=(const char c); // 重载+=操作符来拼接
string& operator+=(const string& str); // 重载+=操作符来拼接
string& append(const char *s); // 把字符串 s 拼接到当前字符串末尾
string& append(const char *s, int n); // 把字符串 s 的前 n 个字符拼接到当前字符串末尾
string& append(const string &s); // 把字符串 s 拼接到当前字符串末尾
string& append(const string &s, int pos, int n); // 把字符串 s 从 pos 位置开始截取 n 个字符,拼接到当前字符串末尾
#include <iostream>
#include <string>
int main(int argc, char* argv[]){
    
    std::string str1 = "I";
    str1 += " Love sleeping";
    std::cout << "str1: " << str1 << std::endl;

    std::string str2 = " and eating.";
    str1 += str2;
    std::cout << "str1: " << str1 << std::endl;

    std::string str3 = "I";
    str3.append(" Love");
    std::cout << "str3: " << str3 << std::endl;

    str3.append(" game abcd", 5); // 前 n 个字符
    std::cout << "str3: " << str3 << std::endl;

    str3.append(str2, 0, 4); // 截取字符串规定位置作为拼接; 第2个参数表示截取的起始位置,第3个参数表示截取字符的个数
    std::cout << "str3: " << str3 << std::endl;
    return 0;
}

1-4--string查找与替换

查找:查找指定字符串是否存在;

替换:在指定的位置替换字符串;

函数原型:
int find(const string& str, int pos = 0) const; // 查找str第一次出现的位置,从pos开始查找;
int find(const char* s, int pos = 0) const; // 查找s第一次出现的位置,从pos开始查找;
int find(const char* s, int pos, int n) const; // 从 pos 位置查找s的前n个字符;
int find(const char c, int pos = 0) const; // 查找字符c第一次出现的位置;
int rfind(const string& str, int pos = npos) const; // 查找str第一次出现的位置,从pos开始查找;(从右往左)
int rfind(const char* s, int pos = npos) const; // 查找s出现的位置,从pos开始查找;(从右往左)
int rfind(const char* s, int pos, int n) const; // 从 pos 位置查找s的前n个字符;(从右往左)
int rfind(const char c, int pos = 0) const; // 查找字符c出现的位置;(从右往左)
string& replace(int pos, int n, const string& str); // 替换从pos开始n个字符为字符串str
string& replace(int pos, int n, const char* s); // 替换从pos开始n个字符为字符串s

代码实例:

#include <iostream>
#include <string>
int main(int argc, char* argv[]){
    
    std::string str1  = "abcdabcd";
    // 从左往右查找
    int pos = str1.find("cd");
    if (pos == -1){
        std::cout << "The dst string is not exist";
    }
    else{
        std::cout << "Find the string, the start pos is: " << pos << std::endl;
    }

    // 从右往左查找
    int pos2 = str1.rfind("cd");
    if (pos2 == -1){
        std::cout << "The dst string is not exist";
    }
    else{
        std::cout << "Find the string, the start pos is: " << pos2 << std::endl;
    }

    // 替换
    std::string str2 = "abcdefg";
    str2.replace(1, 3, "123456"); // 先在原字符串从位置 1 开始删除 3 个字符,再将目标字符串复制到原字符串
    std::cout << "str2: " << str2 << std::endl;
    
    return 0;
}

1-5--string字符串比较

字符串比较是按字符的 ASCII 码进行比较,有以下三种情况:① =,返回 0; ② >,返回1;③ <,返回 -1;

函数原型:
int compare(const string &s) const; // 与字符串 s 比较
int compare(const char *s) const; // 与字符串 s 比较
#include <iostream>
#include <string>
int main(int argc, char* argv[]){
    
    std::string str1 = "C++";
    std::string str2 = "C++";

    if(str1.compare(str2) == 0){
        std::cout << "str1 == str2" << std::endl;
    }
    else if(str1.compare(str2) > 0){
        std::cout << "str1 > str2" << std::endl;
    }
    else{
        std::cout << "str1 < str2" << std::endl;
    }
    
    return 0;
}

1-6--string字符串存取

string中单个字符存取方式有两种:

char& operator[](int n); // 通过[]方式取字符
char& at(int n); // 通过at方法获取字符
#include <iostream>
#include <string>
int main(int argc, char* argv[]){
    
    std::string str1 = "Hello";
    std::cout << "str1: " << str1 << std::endl;

    // 通过[]访问单个字符
    for(int i = 0; i < str1.size(); i++){
        std::cout << str1[i] << " ";
    }
    std::cout << std::endl;

    // 通过at访问单个字符
    for(int i = 0; i < str1.size(); i++){
        std::cout << str1.at(i) << " ";
    }
    std::cout << std::endl;

    // 修改单个字符
    str1[0] = 'A';
    str1.at(1) = 'B';
    std::cout << "str1: " << str1 << std::endl;
    
    return 0;
}

1-7--string字符串插入和删除

对 string 字符串进行插入和删除字符操作,其函数原型如下:

string& insert(int pos, const char* s); // 插入字符串
string& insert(int pos, const string& str); // 插入字符串
string& insert(int pos, int n, char c); // 在指定位置插入 n 个字符c
string& erase(int pos, int n = npos); // 删除从 Pos 开始的 n 个字符
#include <iostream>
#include <string>
int main(int argc, char* argv[]){
    
    std::string str1 = "Hello";
    std::cout << "str1: " << str1 << std::endl;

    // 插入字符串
    str1.insert(1, "AAA"); // 第一个参数表示插入的位置,第二个参数表示插入的字符串
    std::cout << "str1: " << str1 << std::endl;

    // 删除字符串
    str1.erase(1, 3); // 第一个参数表示删除的位置,第二个参数表示删除的个数
    std::cout << "str1: " << str1 << std::endl;
    
    return 0;
}

1-8--获取string子串

在规定位置截取string字符串的子串,其函数原型如下:

std::string substr(int pos = 0, int n = npos) const; // 返回由pos开始的n个字符组成的字符串
#include <iostream>
#include <string>
int main(int argc, char* argv[]){
    
    std::string str1 = "123456@sysu.edu.cn";
    int pos = str1.find("@");
    std::string subStr = str1.substr(0, pos);

    std::cout << "subStr = " << subStr << std::endl;
    return 0;
}

2--vector容器

vector 数据结构与数组类似,被称为单端数组;

vector 与普通数组的区别在于:普通数组时静态空间,而 vector 可以动态扩展;

2-1--vector构造函数

用于创建 vector 容器,其函数原型如下:

vector<T> v; // 默认构造函数
vector(v.begin(), v.end()); // 将v[begin(), end()]区间中的元素拷贝到容器
vector(n, elem); // 构造函数将n个elem拷贝到容器
vector(const vector &vec); // 拷贝构造函数
# include <iostream>
# include <vector>
// # include <string>
// # include <algorithm> // 标准算法的头文件

void printVector(std::vector<int> &v){
    for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++){
        std::cout << *it << " ";
    }
    std::cout << std::endl;
}

void test01(){
    std::vector<int>v1; // 默认构造
    for(int i = 0; i < 10; i++){
        v1.push_back(i);
    }
    printVector(v1);

    std::vector<int>v2(v1.begin(), v1.end()); // 利用区间进行构造
    printVector(v2);

    // n 个 elem 方式构造
    std::vector<int>v3(10, 100); // 10个100
    printVector(v3);

    //拷贝构造
    std::vector<int>v4(v3);
    printVector(v4);
}

int main(){
    test01();

    return 0;
}

2-2--vector赋值操作

vector容器赋值操作的函数原型如下:

vector& operator=(const vector &vec); // 重载等号操作符
assign(beg, end); // 将[beg, end]区间中的数据拷贝赋值给容器
assign(n, elem); // 将n个elem拷贝赋值给容器
# include <iostream>
# include <vector>

void printVector(std::vector<int> &v){
    for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++){
        std::cout << *it << " ";
    }
    std::cout << std::endl;
}

void test01(){
    std::vector<int>v1; 
    for(int i = 0; i < 10; i++){
        v1.push_back(i);
    }
    printVector(v1);

    // =赋值
    std::vector<int> v2;
    v2 = v1;
    printVector(v2);
    
    // assign赋值
    std::vector<int> v3;
    v3.assign(v1.begin(), v1.end());
    printVector(v3);

    std::vector<int> v4;
    v4.assign(10, 100);
    printVector(v4);
}

int main(){
    test01();

    return 0;
}

2-3--vector容器的容量和大小

通过以下函数可以对vector容器的容量和大小进行操作:

empty(); // 判断容器是否为空
capacity(); // 容器的容量
size(); // 返回容器中元素的个数
resize(int num); // 重新指定容器的长度为num,若容器变长,则以默认值填充新位置;如果容器变短,则末尾超出容器长度的元素将会被删除;
resize(int num, elem); // 重新指定容器的长度为num,若容器变长,则以elem值填充新位置;如果容器变短,则末尾超出容器长度的元素将会被删除;
# include <iostream>
# include <vector>
// # include <string>
// # include <algorithm> // 标准算法的头文件

void printVector(std::vector<int> &v){
    for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++){
        std::cout << *it << " ";
    }
    std::cout << std::endl;
}

void test01(){
    std::vector<int>v1; 
    for(int i = 0; i < 10; i++){
        v1.push_back(i);
    }
    printVector(v1);

    if(v1.empty()){
        std::cout << "The vector is empty" << std::endl;
    }
    else{
        std::cout << "The vector is not empty" << std::endl;
        std::cout << "The capacity is: " << v1.capacity() << std::endl;
        std::cout << "The size is:" << v1.size() << std::endl;
    }

    // resize
    v1.resize(15);
    printVector(v1); // 默认以0填充
    v1.resize(20, 1);
    printVector(v1);
    v1.resize(10);
    printVector(v1);

}

int main(){
    test01();

    return 0;
}

2-4--vector的插入和删除

通过以下函数实现对vector容器的插入和删除:

push_back(ele); // 尾部插入元素ele
pop_back(); // 删除最后一个元素
insert(const_iterator pos, ele); // 迭代器指向位置pos插入元素ele
insert(const_iterator pos, int count, ele); // 迭代器指向位置pos插入count个元素ele
erase(const_iterator pos); // 删除迭代器指向的元素
erase(const_iterator start, const_iterator end); // 删除迭代器从start到end之间的元素
clear(); // 删除容器中所有元素
# include <iostream>
# include <vector>
// # include <string>
// # include <algorithm> // 标准算法的头文件

void printVector(std::vector<int> &v){
    for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++){
        std::cout << *it << " ";
    }
    std::cout << std::endl;
}

void test01(){
    std::vector<int>v1; 
    // 尾插
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    printVector(v1);

    // 尾删
    v1.pop_back();
    printVector(v1);

    // 插入
    v1.insert(v1.begin(), 1);
    printVector(v1);

    v1.insert(v1.begin(), 2, 66); // 开头插入2个66
    printVector(v1);

    v1.erase(v1.begin());
    printVector(v1);

    v1.erase(v1.begin(), v1.end() - 1);
    printVector(v1);

    v1.clear();
    printVector(v1);
}

int main(){
    test01();

    return 0;
}

2-5--vector数据存取

使用以下函数可以实现对vector容器的数据存取:

at(int idx); // 返回索引idx所指的数据
operator[]; // 返回索引idx所指的数据
front(); // 返回容器中第一个数据元素
back(); // 返回容器中最后一个数据元素
# include <iostream>
# include <vector>
// # include <string>
// # include <algorithm> // 标准算法的头文件

void printVector(std::vector<int> &v){
    for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++){
        std::cout << *it << " ";
    }
    std::cout << std::endl;
}

void test01(){
    std::vector<int>v1; 
    for(int i = 0; i < 10; i++){
        v1.push_back(i);
    }

    // 通过[]访问
    for(int i = 0; i < v1.size(); i++){
        std::cout<< v1[i] << " ";
    }
    std::cout << std::endl;

    // 通过at访问
    for(int i = 0; i < v1.size(); i++){
        std::cout<< v1.at(i) << " ";
    }
    std::cout << std::endl;

    // 获取第一个元素
    std::cout << "The first elem is: " << v1.front() << std::endl;
    // 获取最后一个元素
    std::cout << "The last elem is: " << v1.back() << std::endl;

}

int main(){
    test01();

    return 0;
}

2-6--vector容器互换

通过以下函数实现两个容器的互换:

swap(vec); // 将vec容器的元素和原来容器的元素进行互换;
# include <iostream>
# include <vector>
// # include <string>
// # include <algorithm> // 标准算法的头文件

void printVector(std::vector<int> &v){
    for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++){
        std::cout << *it << " ";
    }
    std::cout << std::endl;
}

void test01(){
    std::vector<int>v1; 
    for(int i = 0; i < 10; i++){
        v1.push_back(i);
    }
    
    std::vector<int> v2;
    for(int i = 10; i > 0; i--){
        v2.push_back(i);
    }
    
    std::cout << "互换前: " << std::endl;
    printVector(v1);
    printVector(v2);

    std::cout << "互换后: " << std::endl;
    v1.swap(v2);
    printVector(v1);
    printVector(v2);

}

void test02(){
    std::vector<int>v1; 
    for(int i = 0; i < 100000; i++){
        v1.push_back(i);
    }
    std::cout << "v1.capacity: " << v1.capacity() << std::endl;
    std::cout << "v1.size: " << v1.size() << std::endl;

    v1.resize(3); // 重新指定大小,但容量并没有减少
    std::cout << "v1.capacity: " << v1.capacity() << std::endl;
    std::cout << "v1.size: " << v1.size() << std::endl;

    // 使用swap收缩内存
    std::vector<int>(v1).swap(v1); // std::vector<int>(v1)匿名对象
    std::cout << "v1.capacity: " << v1.capacity() << std::endl;
    std::cout << "v1.size: " << v1.size() << std::endl;

}


int main(){
    test02();

    return 0;
}

2-7--vector预留空间

通过预留空间可以减少vector在动态扩展容量时的扩展次数;

reserve(int len); // 容器预留 len 个元素长度,预留位置不初始化,元素不可访问;
# include <iostream>
# include <vector>
// # include <string>
// # include <algorithm> // 标准算法的头文件

void printVector(std::vector<int> &v){
    for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++){
        std::cout << *it << " ";
    }
    std::cout << std::endl;
}

void test01(){
    std::vector<int>v1; 
    int num1 = 0; // 统计开辟次数
    int *p1 = NULL;
    for(int i = 0; i < 100000; i++){
        v1.push_back(i);
        if(p1 != &v1[0]){
            p1 = &v1[0];
            num1++;
        }
    }
    std::cout << "num: " << num1 << std::endl;

    // 利用reserve()预留空间
    std::vector<int>v2; 
    v2.reserve(100000);
    int num2 = 0; // 统计开辟次数
    int *p2 = NULL;
    for(int i = 0; i < 100000; i++){
        v2.push_back(i);
        if(p2 != &v2[0]){
            p2 = &v2[0];
            num2++;
        }
    }
    std::cout << "num: " << num2 << std::endl;
}

int main(){
    test01();

    return 0;
}

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

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

相关文章

媒体邀约的形式和步骤

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 做媒体服务很多年&#xff0c;今天就与大家分享下媒体邀约都有哪些形式&#xff1a; 1&#xff0c;电话邀约&#xff1a;通过电话与媒体记者进行沟通&#xff0c;邀请其参加活动或接受采…

CDC 长沙站丨云原生技术研讨会:数字兴链,云化未来!

一、活动信息&#xff1a;活动主题&#xff1a;CDC 长沙站丨云原生技术研讨会活动时间&#xff1a;2023 年 3 月 14 日下午 14&#xff1a;30-17&#xff1a;30活动地点&#xff1a;长沙市岳麓区-拓维信息总部 1 楼多功能厅活动参与方式&#xff1a;免门票参与&#xff0c;戳此…

船舶自动驾驶避撞规则

1无人船避碰阶段 如图1所示。 第一阶段&#xff1a;感知阶段。使用雷达、AIS、激光雷达和视觉传感器等感知传感器进行障碍物检测。利用感知到的信息&#xff0c;获得障碍物的运动信息。 第二阶段&#xff1a;决策阶段。利用障碍物的运动信息做出避免冲突的决策。在这一阶段&am…

数据结构排序比较

排序的概念及其运用 (1)排序的概念 排序:所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&am…

Spring-AOP工作流程

Spring-AOP工作流程 3&#xff0c;AOP工作流程 3.1 AOP工作流程 由于AOP是基于Spring容器管理的bean做的增强&#xff0c;所以整个工作过程需要从Spring加载bean说起: 流程1:Spring容器启动 容器启动就需要去加载bean,哪些类需要被加载呢?需要被增强的类&#xff0c;如:B…

C++ Qt自建网页浏览器

C Qt自建网页浏览器如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<C Qt自建网页浏览器>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推荐首选。文…

手把手教你实现书上的队列,进来试试?

一.队列的基本概念队列的定义队列&#xff08;queue&#xff09;是只允许在一端进行插入操作&#xff0c;而在另一端进行删除操作的线性表。队列是一种先进先出&#xff08;First In First Out&#xff09;的线性表&#xff0c;简称FIFO。允许插入的一端称为队尾&#xff0c;允…

如何取消电脑开机密码?1分钟可学会,快速取消

​如果小伙伴觉得每次开机都需要输入密码很烦&#xff0c;那么小伙伴应该学会如何取消电脑开机密码。本篇文章&#xff0c;小编将以图文教学的方式&#xff0c;向小伙伴介绍如何在短短的1分钟内&#xff0c;就能够取消电脑开机密码&#xff0c;让小伙伴摆脱烦人的开机密码&…

Pytorch优化器Optimizer

优化器Optimizer 什么是优化器 pytorch的优化器&#xff1a;管理并更新模型中可学习参数的值&#xff0c;使得模型输出更接近真实标签 导数&#xff1a;函数在指定坐标轴上的变化率 方向导数&#xff1a;指定方向上的变化率&#xff08;二元及以上函数&#xff0c;偏导数&am…

windows安装docker-小白用【避坑】【伸手党福利】

目录实操开启 Hyper-V 和容器特性下载docker安装dockercmd中&#xff0c;使用命令测试是否成功报错解决办法&#xff1a;下载linux模拟器wsl&#xff1a;双击打开docker重新打开cmd&#xff0c;输入命令&#xff0c;成功显示sever和clinet实操 开启 Hyper-V 和容器特性 控制面…

项目进度管理:项目经理应该怎么做?

项目经理的职责是非常清晰的、界面分明的。项目经理经常忙碌的原因是&#xff0c;缺乏规划&#xff0c;觉得很多业务都跟自己相关&#xff0c;但不知道到底要做哪些工作&#xff0c;没有把多个角色分清楚。 1、目标。 项目目标是实施项目所要达到的期望结果&#xff0c;一个明…

基于嵌入式linux的OpenSSL源码移植(基于arm64)

SSL是Secure Sockets Layer&#xff08;安全套接层协议&#xff09;的缩写&#xff0c;可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时&#xff0c;提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支…

类和对象(一)

类和对象&#xff08;一&#xff09; C并不是纯面向对象语言 C是面向过程和面向对象语言的&#xff01; 面向过程和面向对象初步认识&#xff1a; C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基…

驱动程序开发:FTP服务器和OpenSSH的移植与搭建、以及一些笔记

目录一、FTP服务器移植与搭建1、在ubuntu下安装vsftpd2、在window下安装FileZilla3、移植vsftpd到开发板上4、Filezilla 连接测试5、注意点二、开发板 OpenSSH 移植与使用1、移植 zlib 库2、移植 openssl 库3、移植 openssh 库4、openssh 使用测试三、关于u-boot上的操作及根文…

数据表(二) - 数据表的制作方式

本篇来介绍下数据表的几种制作数据的方式。Excel是大部分数值策划选择用的填数工具&#xff0c;因为Excel是天生为数据处理而生&#xff0c;而Excel转为什么格式就需要选择了。最简单的就是直接将Excel里的数据复制黏贴到文本文件作为游戏数据。这种简单快捷的方式任何人都能做…

DatenLord前沿技术分享 No.20

达坦科技专注于打造新一代开源跨云存储平台DatenLord&#xff0c;致力于解决多云架构、多数据中心场景下异构存储、数据统一管理需求等问题&#xff0c;以满足不同行业客户对海量数据跨云、跨数据中心高性能访问的需求。喷泉码具有极高的纠错能力&#xff0c;且具有低延迟、地复…

CnOpenData·A股上市企业数字化转型指数数据

一、数据简介 企业数字化转型是近年来中国社会各界重点关注的领域&#xff0c;但基础数据的不完善在很大程度上制约了相关科学研究的开展。构建合理、科学的数字化转型指标体系有利于学者定量地研究企业数字化的相关问题&#xff0c;也有利于衡量企业的数字化水平。广东金融学院…

Linux驱动开发

一、驱动分类Linux中包含三大类驱动&#xff1a;字符设备驱动、块设备驱动和网络设备驱动。其中字符设备驱动是最大的一类驱动&#xff0c;因为字符设备最多&#xff0c;从led到I2C、SPI、音频等都属于字符设备驱动。块设备驱动和网络设备驱动都要比字符设备驱动复杂。因为其比…

标度不变性(scale invariance)与无标度(scale-free)概念辨析

文章目录标度标度种类名义标度序级标度等距标度比率标度常用标度方法不足标度不变性标度不变&#xff08;Scale-invariant&#xff09;曲线和自相似性&#xff08;self-similarity&#xff09;射影几何分形随机过程中的标度不变性标度不变的 Tweedie distribution普适性&#x…

蓝牙及其安全技术概述

作者 | 陆杰 上海控安可信软件创新研究院研发工程师 来源 | 鉴源实验室 01 背 景 汽车已成为现代社会生活不可或缺的一部分。车辆蓝牙[1]安全非常重要&#xff0c;因为未经保护的蓝牙连接可能会被黑客利用来获取车辆的敏感信息、控制车辆等&#xff0c;从而对车辆的安全和车主…