C++: String类接口学习

news2024/11/23 20:04:16

文章目录

  • STL简介
  • 一. 为什么要有string类
  • 二. STL 中的 string 类介绍
    • 1. string 类描述
    • 2. 关于 basic_string
  • 三. string 类的常用接口
    • 1. string 类的常见构造
    • 2. string 类的容量操作
      • size 和 length
      • capacity
      • max_size
      • reserve
      • resize
    • 3. string 类对象的访问及遍历操作
      • operator[] 和 at()
      • 使用迭代器进行遍历
      • 范围 for (C++11)
    • 4. string类的修改操作
      • push_back
      • append
      • operator+=
    • 5.string 类对象的操作
      • c_str
      • find 和 substr

本章开始, 进入学习 C++ STL 的阶段, 现简单了解一下什么是 STL

STL简介

STL(standard template libraru -标准模板库): 是C++标准库的重要组成部分, 不仅是一个可复用的组建爱你哭, 而且是一个包罗数据结构与算法的软件框架.

STL的版本
市面上最常用的是 P.J.版本(被Windows Visual C++ 采用)和 SGI版本(被GCC采用)

STL六大组件

在这里插入图片描述

一. 为什么要有string类

在C语言中, 已经学习过字符串了.

C语言中, 字符串是以 \0 为结尾的一些字符的集合.
为了操作方便, C标准库 <string.h> 提供了一些处理字符串的库函数.
但是这些库函数是与字符串分开的, 不符合 OOP 的思想, 而且底层空间需要用户自己管理, 稍不留神就可能出现越界访问.

string类比STL出现的要早, 原因就是 string 的使用太常见了, 最后将 string 归入 STL 中.

二. STL 中的 string 类介绍

1. string 类描述

在 STL 中最常用的一个数据结构就是 string .

  • 字符串是表示字符序列的对象.
  • 标准 string 类提供的借口类似与 standard container 所提供的字符接口, 同时专门增加了操作 single-byte 字符串的设计特性
  • string 类是 basic_string<char> 模板的实例, 并用 char_traitsallocator 作为 basic_string 的默认参数
  • string 类独立于所使用的编码来处理字节, 如果用来处理多字节或者变长字符(如 UTF-8) 的系列, string 类仍然按照字节来操作, 而不是按照实际编码的字符来操作.

总结

  1. string 是表示字符串的字符串类.
  2. 该类的接口与常规容器的接口基本相同, 再添加了一些专门操作 string (例如单字节字符串)的常规操作.
  3. string 在底层实际是: basic string 模板类的别名.
typedef basic_string<char, char_traits, allocator> string;
  1. 不能操作多字节或者变长字符的序列.

使用 string 类, 需要:

#include<string>    // 使用 string 类需要引入头文件
using std::string   // string 标识在命名空间 std 中

2. 关于 basic_string

通过查看文档,可以看到 basic_string 是一个模板

template < class charT, 
class traits = char_traits<charT>,    // basic_string::traits_type           
class Alloc = allocator<charT>        // basic_string::allocator_type           
> class basic_string;

这里的 charT 表示实例化后的类需要按照 charT 类的字符处理字符串.

根据不同的 charT 类, 可以生成四种字符串类
在这里插入图片描述

UTF-8 就是一个字符有 8bit, 众所周知 char 类型的一个数据有 8 bit.
wstring 常用来处理 Unicode 类型的字符
还有UTF-16, UTF-32字节编码类型.

对于 stringbasic_string 模板实例化的一个类就可以很好理解了

typedef basic_string<char, char_traits, allocator> string;

string 就是用来处理 单字节字符的字符串, 不适用于用来处理变长字符或者多字节字符串.
其他字符串有 basic_string 模板实例化的其他类来处理.

三. string 类的常用接口

1. string 类的常见构造

官方文档 C++98 下的所有 string 类构造函数:

在这里插入图片描述

重点掌握:

string()                  //构造空的 string 类对象, 即空字符串
string(const char* s)       //使用 C-string 来构造 string 对象
string(size_t n, char c)  //string 类对象中包含 n个字符c
string(const string &c)   //拷贝构造函数

代码演示:

int main()
{
  // string()
  string s1 = string(); // 无参构造

  // string(const char *s)
  string s2 = string("Hello string"); // 使用C格式字符串构造

  // string(size_t n, char c)
  string s3 = string(4, 'c'); // 使用 4个c字符 构造

  // string(const string& s)
  string s4 = string(s3); // 拷贝构造
}

在这里插入图片描述


string(const string& str, size_t pos, size_t len = npos)
// 用 str 从 [pos, pos+len) 来拷贝构造.
// 如果范围超过了 pos位置到字符串末尾的长度, 拷贝到字符串结尾就停止了.

这里的 npos 是最大的 size_t, 在 64 位下就是 2 64 − 1 = 9223372036854775808 2^{64}-1 = 9223372036854775808 2641=9223372036854775808, 它是 string 类的静态成员, 使用 string::npos

在这里插入图片描述

代码演示:

int main()
{
  string s1 = string("12345678");
  string s2 = string(s1, 1, 5);     // [1, 6)
  string s3 = string(s1, 0);        // [0, s1.size()) 第三个参数不写默认用缺省值 npos
}

在这里插入图片描述


补充

string 类同样重载了 = , 可以直接按照下面的格式, 编译器会直接优化成用该C格式字符串进行构造.

string s1 = "Hello string";

2. string 类的容量操作

函数名称功能说明
size返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
empty检测字符串是否位空串, 是返回 true, 否则返回 false
max_size返回字符串可取的最大有效字符长度
clear清空有效字符
reserve为字符串预留空间
resize将有效字符的个数改成n个, 多出的空间用字符c填充

size 和 length

size_t size() const;
size_t length() const;

size()length()都是得到字符串的有效长度, 两者没有区别.

int main()
{
  string s1;
  cout << "Please input a string: ";
  cin >> s1;

  cout << "Your input: " << s1;
  cout << "s1.size(): " << s1.size() << endl;
  cout << "s1.length(): " << s1.length() << endl;

  return 0;
}

程序运行结果:
在这里插入图片描述

注意:
size()length() 不包括 \0 , \0 是结尾标识符, 不被算作字符串的长度.

length()的出现是要比 size() 要早的. 一开始 string 类出现的时候并没有 STL, STL 其他很多容器计算大小都是使用 size()
为了将 string 放入 STL, 也让 string 类拥有了 size() 方法, 两者在底层是一模一样的.

size()length() 的底层源码: 甚至 length() 底层是直接调用 size()

size_type size() const { return _M_finish - _M_start; } //有效字符的个数,finish永远指向\0

size_type length() const { return size(); }

capacity

size_t capacity() const;

capacity() 得到当前 string 对象的可存放有效字符的容量值, capacity >= size, 如何扩容取决于编译器底层扩容机制

下面写一个程序用来测试 g++(Linux) 的扩容机制

int main()
{
  string s1 = string();
  size_t old_capacity = s1.capacity();
  cout << old_capacity << endl;

  for (int i = 0; i < 500; i++)
  {
    s1.push_back('x');
    if (old_capacity != s1.capacity())
    {
      old_capacity = s1.capacity();
      cout << old_capacity << endl;
    }
  }

  return 0;
}

发现在Linux下 g++编译器的扩容机制是这样的: 第一次直接开 15 个字符的空间, 之后每次扩容为当前容量的两倍.

在这里插入图片描述

max_size

size_t max_size() const;

max_size() 可以返回字符串的最大长度

int main()
{
  string s1;
  cout << s1.max_size() << endl;
  
  return 0;
}

程序运行结果如下: 在这里插入图片描述, 转换为 16进制: 0x3FFFFFFFFFFFFFFF, 结果是 int 类型可取最大正整数 2^63-1 的一半.

max_size() 所返回的数不能保证真的能创建一个这么大容量的 string 类对象, 程序很有很有可能报异常.

在这里插入图片描述

max_size() 的主要作用就是通过得到的返回值可以得到系统或者库中实现的限制, 提醒不能超过这么大的容量, 实践中参考和使用价值并不大.

reserve

void reserve(size_t n = 0);

reserve() 可以申请为 string 类扩容, 使得扩容后的 capacity 可以存放输入参数长度的字符串. 不一定就会扩容输入参数, capacity >= n 即可(例如输入500, 不一定会只开500)

  • 如果 n > capacity, 编译器会将 capacity 扩容至 n(可能大于n)
int main()
{
  string s1("Hello,world");
  cout << "size: " << s1.size() << endl;
  cout << "begin: " << s1.capacity() << endl;

  // n > size
  s1.reserve(300);
  cout << "n > size: " << s1.capacity() << endl;

  return 0;
}

程序运行如下: 在 Linux g++ 下, s1capacity 被扩容至了 n
在这里插入图片描述

  • 如果 n < capacity, capacity 不会被改变
int main()
{
  string s1("Hello,world");
  cout << "size: " << s1.size() << endl;
  cout << "begin: " << s1.capacity() << endl;

  s1.reserve(13);
  cout << "s1.reserve(13): " << s1.capacity() << endl;

  s1.reserve(1);
  cout << "s1.reserve(1): " << s1.capacity() << endl;

  return 0;
}

程序运行结果如下: n < capacity 时, 无论 n 是比 size 大还是小, 都不会对 capacity 进行改变

在这里插入图片描述

总结:reserve 只提供扩容功能, 不会对原本的数据进行修改.

resize

void resize(size_t n);
void resize(size_t n, char c);

resize() 会修改 string 类对象的 sizen

  • 如果 n > capacity, 将 capacity 扩容至少到 n, 同时插入字符(默认是'\0')至 sizen

  • 如果 n <= capacity && n >= size , 直接尾插字符, 容量不变

  • 如果 n < size, 将 n 位置字符替换为 0, 容量不变

  • n > capacity

int main()
{
  string s1 = "1234567890";
  cout << "begin\nsize: " << s1.size() << "\ncapacity: " << s1.capacity() << endl << endl;

  // n > capacity
  s1.resize(40);
  cout << "after s1.resize(40)\nsize: " << s1.size() << "\ncapacity: " << s1.capacity() << endl;
}

程序运行结果:
注意: 只有字符串中最后一个'\0'会被认为是结尾标识符, 前面的'\0'都是有效字符
在这里插入图片描述

  • n <= capacity && n >= size
s1.resize(13);
cout << "after s1.resize(13)\nsize: " << s1.size() << "\ncapacity: " << s1.capacity() << endl;

程序运行结果:
在这里插入图片描述

  • n < size
s1.resize(5);
cout << "after s1.resize(5)\nsize: " << s1.size() << "\ncapacity: " << s1.capacity() << endl;

程序运行结果为:

在这里插入图片描述

resize() 常用作在知道需要开很大空间的前提下, 提前开空间进行初始化, 避免重复扩容, 扩容消耗很大.

3. string 类对象的访问及遍历操作

函数名称功能说明
operator[]返回 pos 位置的字符, const string 类对象调用
begin + endbegin 获取第一个字符的迭代器 + end 获取最后一个字符下一个位置的迭代器
rbegin + rendrbegin 获取最后一个字符的迭代器 + rend 获取第一个字符前一个位置的迭代器
范围 forC++11支持更简洁的范围 for 的新遍历方式

operator[] 和 at()

如果想要访问字符串的元素, 可以使用[] 来访问, 并使用 for 循环来遍历字符串

int main()
{
  string s1 = "hello world!";

  for (size_t i = 0; i < s1.size(); i++)
  {
    cout << s1[i]; // 使用 operator[] 访问每个字符
  }

  cout << endl;
}

就像使用 for 循环遍历数组一样, 通过 [] 解引用访问每一个数组元素.

这里的 []运算符重载, 同等于下面的形式, 即 operator[], s1 通过调用运算符重载来达到访问该位置元素的效果, 传入参数为元素的下标序号(index position)

cout << s1[i];   
cout << s1.operator[](i) <<;  // 返回下标为 i 的元素的引用

如果想要修改该位置的元素, 也是可以通过 [] 进行修改的

int main()
{
  string s1("helloworld");

  for (size_t i = 0; i < s1.size(); i++)
  {
    ++s1[i];    // 对 s1 的每个字符都加1
  }

  cout << s1 << endl;
}

程序结果为: 在这里插入图片描述

operator[] 运算符重载有两种形式

char& operator[] (size_t pos);              // 可读可写
const char& operator[] (size_t pos) const;  // 只读不可写

为了让运算符重载支持对原位置元素的修改, 需要返回 char& 对原位置元素的引用.
同时也提供 cosnt 版本, 调用运算符重载的对象是一个 const 对象时, 通过对原位置的 const 引用, 以达到不可修改的作用.


at()[] 起到的作用都是一样的, 取到下标为 i 的元素, 可以对其进行修改.

唯一的区别是两者对越界的处理.

  • [] 可以访问 [ 0 , s i z e ] [0, size] [0,size] 的元素, 如果越界直接断言, 程序停止.
  • at() 可以访问 [ 0 , s i z e ) [0, size) [0,size) 的元素, 如果越界会报异常, 处理相对温和.

在这里插入图片描述

在这里插入图片描述

但一般情况还是 [] 用的比较多.

还有一个需要注意的点:
下标的是一个 size_t 类型, 即 string::size_type. 但一般写 int 类型的就可以了. 64位机器下, 对于小于 2 63 − 1 2^{63}-1 2631的下标, intsize_t 是一样的, 如果为了规范, 当然是更推荐写 size_t 类型.


使用迭代器进行遍历

迭代器(iterator)是 C++ STL的组件之一, 作用是用来遍历容器

int main()
{
  string s1 = "Hello,world!";

  string::iterator it = s1.begin();
  while (it != s1.end()){
    cout << *it << " ";
    ++it;
  }

  cout << endl;
}

程序运行结果: 在这里插入图片描述

iterator 的用法是指针, 但是不一定是指针, 目前使用它只要像使用指针一样.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

it 的类型是 string::iterator, iteratorstring 类的成员变量.

iterator 遍历对于像 string 这样底层连续的容器看起来不如使用 [] 来的直接简便.
但是对于物理结构非线性的结构却十分高效, 例如链式结构, 树形结构, 哈希结构这样的容器, 是不可以用 [] 的形式来遍历访问到每一个元素的.
因为 [] 在底层本质是通过相对于首元素的偏移量来访问到对应元素的. 而上述结构在物理结构上并不是连续的, 不可以通过偏移量来访问到每个元素.

iterator不用关心底层是怎么实现的, 通用性更强. 上述用来 iterator 遍历同样适用于非线性结构.

如果想要反向遍历, 也有对应的 rbeginrend 使用, 要使用反向迭代器类 reverse_iterator

int main()
{
  string s1("Hello,world!");

  string::reverse_iterator it = s1.rbegin();
  while (it != s1.rend()){
    cout << *it;
    ++it;
  }

  cout << endl;
}

程序运行结果是: 在这里插入图片描述

在这里插入图片描述


下面是 string 类的所有迭代器类成员变量
在这里插入图片描述

如果容器对象是 const 对象, 也有对应的 const_iterator.
不同于 const iterator , const_iterator 限制的是不可以通过对指向容器的元素进行修改, 而 const iterator 则是限定了 it 不可以修改, 这显然是不对的.

同样的, beginend, rbeginrend 也重载了 const 修饰的成员函数
在这里插入图片描述

如果不想让迭代器对原数据进行修改, 可以这样定义 it

string::const_iterator it = s1.begin();

编译器会自动使用 begin()const形式.

C++11 新增了 cbegin, cend, crbegin, crend; 这些仅有 const 版本, 但是并不实用.

范围 for (C++11)

C++11添加了范围 for 的语法, 配合 auto 关键字, 可以更为简洁地进行遍历

int main()
{
  string s1 = "Hello,world";

  // 编译器将 auto 推导为 string::iterator
  for (auto e: s1){
    cout << e;
  }
  cout << endl;
}

程序运行结果为: 在这里插入图片描述

其实底层仍然是使用迭代器进行遍历, 只是看起来更为简洁. 配合 auto 可以使整个代码大大缩短, 但是降低了程序可读性.

配合引用, 也可以进行原数据上的修改

int main()
{
  string s1 = "Hello,world";

  for (auto& e: s1){
    ++e;
  }
  cout << s1 << endl;
}

程序运行结果为: 在这里插入图片描述

4. string类的修改操作

函数名称功能说明
push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+=在字符串后追加字符串str

push_back

void push_back(char c);

只能尾插一个字符, 不可以尾插字符串.

int main()
{
  string s = "abcde";
  s.push_back('f');
  cout << s << endl;

  return 0;
}

在这里插入图片描述

append

在这里插入图片描述

append() 就可以尾插一个字符串, 也可以尾插一个 string 类对象

int main()
{
  string s = "abcde";
  s.append("fg"); // 尾插c格式串
  cout << s << endl;

  string s1 = "hijklm";
  s.append(s1); // 尾插string类对象
  cout << s << endl;

  return 0;
}

程序运行结果如下: 在这里插入图片描述

注意:插入字符需要指定数量, 只写插入的字符.

int main()
{
  string s = "abcdef";
  s.append(1, 'g');
  cout << s << endl;
  
  return 0;
}

程序运行结果如下: 在这里插入图片描述

operator+=

在这里插入图片描述

一般更加常用的是 operator+=, 既可以尾插字符,也可以尾插字符串

int main()
{
  string s = "12345";
  s += '6';             // 尾插字符
  s += "789";           // 尾插字符串
  s += string("0000");  // 尾插string类对象

  cout << s << endl;
  return 0;
}

程序运行结果: 在这里插入图片描述

5.string 类对象的操作

函数名称功能说明
c_str返回c格式字符串
find+npos从字符串pos位置开始往后找字符c, 返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c, 返回该字符在字符串中的位置
substr在str中从pos位置开始, 截取n个字符, 然后将其返回

c_str

const char *c_str() const;

返回一个指向 string 类对象的 c格式字符串(以'\0'为结尾) 成员的const 指针

在一些只有C格式字符串接口的操作中, 该函数的作用就体现了.
例如一些嵌入式程序, 以及下面的文件读写操作.

如果想用 C语言 的文件操作相关函数, 必须要传 C格式字符串 才可以找到该文件(即 const char *)

string file("file.txt");
FILE *fp = fopen(file.c_str(), "r");

find 和 substr

如果要取文件名的后缀, 使用 find() 就可以很快的找到 . 的位置
在这里插入图片描述

find() 可以从 pos 位置开始找要查找的目标, 如果找到返回首元素下标, 如果没找到返回 string::npos

同时结合 sbustr() 可以截取指定长度的字符串, 第二个参数缺省值为 npos

在这里插入图片描述

int main()
{
  string file = "hello.c";
  size_t pos = file.find('.', 0); // 找到 . 的位置

  if (pos != string::npos){
    cout << file.substr(pos) << endl; // 截取 . 位置之后的字符串
  }

  return 0;
}

程序运行结果如下: 在这里插入图片描述

通过分离网址, 再熟悉一下 find()substr() 的操作

int main()
{
  string str("https://legacy.cplusplus.com/reference/string/string/substr/");

  size_t pos1 = str.find(':');
  cout << str.substr(0, pos1 - 0) << endl;

  size_t pos2 = str.find('/', pos1 + 3);
  cout << str.substr(pos1 + 3, pos2 - pos1 - 3) << endl;

  cout << str.substr(pos2 + 1) << endl;

  return 0;
}

程序运行结果如下: 在这里插入图片描述

本章完.

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

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

相关文章

酷开系统 | 酷开科技聚焦价值人群 助力营销增长

2023年&#xff0c;是消费复苏回暖的一年&#xff0c;市场中充溢着大量品牌重启增长的机遇与实例。品牌商期望能够把握住市场趋势&#xff0c;通过营销获得确定性的业绩提升&#xff0c;并在未来收获长期稳定的增长。作为数字媒介的代表之一&#xff0c;OTT大屏营销的属性和价值…

深入浅出 Vue 中的插槽 slot

深入浅出 Vue 中的插槽 slot start 最近被问到好几次 Vue 中的插槽相关知识&#xff0c;掌握的还是有些不全面。抱着重新学习的心态&#xff0c;写这篇博客。首先对基础知识做一个回顾&#xff0c;然后再对源码实现做一个学习。作者&#xff1a;番茄编写时间&#xff1a;2023…

泄密零容忍!迅软科技打造设计图纸安全防线,助您无忧创作!

对于建筑设计、鞋服设计、动漫设计、平面设计等设计行业而言&#xff0c;海量设计图纸都以电子数据的形式存在企业的终端电脑上&#xff0c;这些图纸蕴含着企业的核心竞争资源&#xff0c;一旦泄露将给企业带来巨大的经济损失。 因此&#xff0c;迅软科技采用了先进的数据加密技…

自写一个函数将js对象转为Ts的Interface接口

如今的前端开发typescript 已经成为一项必不可以少的技能了&#xff0c;但是频繁的定义Interface接口会给我带来许多工作量&#xff0c;我想了想如何来减少这些非必要且费时的工作量呢&#xff0c;于是决定写一个函数&#xff0c;将对象放进它自动帮我们转换成Interface接口&am…

嵌入式总线技术详解

1. 总线概述 1.1 总线定义 总线&#xff08;Bus&#xff09;是计算机各种功能部件之间传送信息的公共通信干线它是由导线组成的传输线束&#xff0c;按照计算机所传输的信息种类&#xff0c;计算机的总线可以划分为数据总线、地址总线和控制总线&#xff0c;分别用来传输数据…

20天GMV超过百万美金!桌下迷你跑步机在TikTok Shop美国站热销

上周总GMV达到1.59亿美元&#xff0c;达到历史新高&#xff0c;是美国站自开通以来首次单周出单达到亿级&#xff1b;日均出单1660万美元&#xff0c;单日出单最高达2820万美元&#xff1b; 截至11月19日&#xff0c;GMV Top 5 的商品分类排名依次为&#xff1a;美妆个护、女士…

【vue脚手架配置代理+github用户搜索案例+vue项目中常用的发送Ajax请求的库+slot插槽】

vue脚手架配置代理github用户搜索案例vue项目中常用的发送Ajax请求的库slot插槽 1 vue脚手架配置代理2 github用户搜索案例2.1 静态列表2.2 列表展示2.3 完善案例 3 vue项目中常用的发送Ajax请求的库3.1 xhr3.2 jQuery3.3 axios3.4 fetch3.5 vue-resource 4 slot 插槽4.1 效果4…

【嵌入式】开源shell命令行的移植和使用(1)——nr_micro_shell

目录 一 背景说明 二 移植准备 三 移植过程 四 实际使用 一 背景说明 在进行调试和维护时&#xff0c;常常需要与单片机进行交互&#xff0c;获取、设置某些参数或执行某些操作&#xff0c;nr_micro_shell正是为满足这一需求&#xff0c;针对资源较少的MCU编写的基本命令行…

VT-MRPA1-151-1X/V0/0控制2FRE16模块式模拟放大器

适用于控制带有电气位置反馈的直动式比例减压阀&#xff08;DBETR- 1X 类型&#xff09;或带有电气位置反馈的比例流量控制阀&#xff08;2FRE... 类型&#xff09;&#xff1b;控制值输入 1 0 V&#xff08;差动输入&#xff09;&#xff1b; 可分别调节“上/下”斜坡时间的斜…

计算机网络:快速了解网络框架

文章目录 前言一、什么是Internet&#xff1f;1.从具体构成角度什么是协议&#xff1f; 2.从服务角度3小结 二、网络边缘1.采用网络设施面向连接服务&#xff08;TCP&#xff09;2.采用基础设施的无连接服务&#xff08;UDP&#xff09; 三、网络的核心1.电路交换2.分组交换3.分…

vue2 el-table 封装

vue2 el-table 封装 在 custom 文件夹下面创建 tableList.vue直接上代码&#xff08;代码比较多&#xff0c;复制可直接用&#xff09; <template><div class"mp-list"><el-tableref"multipleTable"class"mp-custom-table":dat…

一起学docker系列之十二什么是dockerfile

目录 1 基本概念2 语法规则3 Dockerfile构建步骤4 Dockerfile、Docker镜像和Docker容器的关系5 保留字介绍5.1 FROM5.2 MAINTAINER5.3 RUN5.4 EXPOSE5.5 WORKDIR5.6 USER5.7 ENV5.8 ADD5.9 COPY5.10 VOLUME5.11 CMD5.12 ENTRYPOINT 6 总结7 参考地址 1 基本概念 Dockerfile是一…

cpu飙升问题排查以及解决

1、查看内存占用排行 top -c 2、查看服务器内存使用情况 free -h 3、查看文件夹磁盘空间大小 Linux 查看各文件夹大小命令du -h --max-depth1 (1)查看文件目录一级目录磁盘空间 du -h --max-depth1 (2&#xff09;查看指定文件目录 du sh home --max-depth2 4、Linux下…

Linux系统---环境变量+内核进程调度队列(选学)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、环境变量 1.基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数&#xff0c;如: 我们在编写CI/…

Java-多线程基本知识学习总结

多线程 前言一、线程的创建1、继承Thread类2、实现Runnable接口 二、线程的生命周期三、操作线程的方法1、线程的休眠2、线程的加入3、线程的礼让4、线程的优先级 四、线程同步End 前言 Java是支持多线程的编程语言&#xff0c;所谓多线程就是程序能够同时完成多种操作。 计算…

MSB3541 Files 的值“<<<<<<< HEAD”无效。路径中具有非法字符。

MSB3541 Files 的值“<<<<<<< HEAD”无效。路径中具有非法字符。 一般来说出现这个问题是因为使用git版本控制工具合并代码出现了问题&#xff0c;想要解决也很简单。 如图点击错误后定位到文件&#xff0c;发现也没有什么问题。 根据错误后边的提示&a…

GoWeb学习-第二天

文章目录 从零开始学Go web——第二天一、安装Go语言二、建立web目录2.1 创建GO语言包目录2.2 创建Go web文件 三、编译并运行Go web应用3.1 编译并运行3.2 查看结果 从零开始学Go web——第二天 ​ 第一天我们了解了与web息息相关的HTTP协议&#xff0c;聊了聊Go与web的关系等…

深度解读:为什么要做数据合规?如何做到数据合规?

数据资源“入表”在即&#xff0c;企业更需筑牢数据合规防线。但企业主企业购买数据、获取数据到底是否合法合规&#xff0c;入表如何防范合规风险&#xff1f;上周三&#xff0c;亿信华辰邀请到北京鑫诺律师事务所高级合伙人、管委会副主任武婕将和大家分享《数据入表法律合规…

扩散模型DDPM学习笔记

扩散模型DDPM 文章目录 扩散模型DDPM如何运作基本概念训练过程推理过程&#xff1a; 目标损失函数推导评估标准 论文地址&#xff1a; Denoising Diffusion Probabilistic Models (DDPM) 如何运作 ​ 从guassian distribution进行采样得到一个噪声的图片&#xff0c;图片大小…

使字符串的单词倒序输出表示

题目 任务描述 本关任务&#xff1a;请实现函数 revWordoder&#xff0c;能够将 pa 指向的单词表字符串中的所有单词&#xff0c;按相反顺序放入 pb&#xff0c;同时去除多余的空格&#xff0c;单词之间只留一个空格. 例如 pa 中为 red blue, 则调用函数后&#xff0c;pb 中为b…