C++:string (用法篇)
文章目录
- 前言
- 一、string 是什么?
- 二、C++语法补充
- 1. auto
- 2. 范围for
- 三、string类对象的常见构造
- 1. Construct string object
- 2. String destructor
- 3. operator=
- 四、string迭代器相关
- 1. begin与end
- 1)begin
- 2)end
- 3)使用
- 2. rbegin 与 rend
- 1)rbegin
- 2)rend
- 3)使用
- 五、容量相关
- 1. resize
- 2. reserve
- 3. 使用
- 六、元素的访问相关
- 1. operator[]
- 2. at
- 3. back
- 4. front
- 七、 string类对象的修改操作
- 1. append
- 2. operator+=
- 3. assign
- 4. insert
- 5. erase
- 6. replace
- 八、对于字符串操作部分
- 1. c_str()
- 2. find 与 rfind
- 3. substr
- 九、非成员函数函数重载
- 1. operator+
- 2. operator<< 与 orerator >>
- 3. getline
- 总结
前言
string接口总结:
分类 | 函数名 | 功能 | 示例代码 |
---|---|---|---|
构造函数 | std::string() | 默认构造空字符串 | std::string s1; |
std::string(const char* s) | 从 C 字符串构造 | std::string s2("Hello"); | |
std::string(const std::string& str) | 拷贝构造函数 | std::string s3(s2); | |
std::string(const char* s, size_t n) | 使用部分 C 字符串构造 | std::string s4("Hello", 3); | |
std::string(size_t n, char c) | 使用 n 个字符 c 构造 | std::string s5(5, 'x'); | |
std::string(InputIt first, InputIt last) | 通过迭代器范围构造 | std::string s6(v.begin(), v.end()); | |
析构函数 | ~std::string() | 销毁字符串对象 | 无需直接调用 |
赋值操作符 | operator= | 赋值操作 | std::string s1 = s2; |
operator=(const char* s) | 通过 C 字符串赋值 | s1 = "Hello"; | |
operator=(char c) | 通过单个字符赋值 | s1 = 'A'; | |
operator=(std::initializer_list<char>) | 通过初始化列表赋值 | s1 = {'H', 'i'}; | |
迭代器 | begin() | 返回指向开头的迭代器 | auto it = s.begin(); |
end() | 返回指向末尾后的迭代器 | auto it = s.end(); | |
rbegin() | 返回指向反向开始的迭代器 | auto rit = s.rbegin(); | |
rend() | 返回指向反向末尾后的迭代器 | auto rit = s.rend(); | |
cbegin() | 返回指向常量开头的迭代器 | auto cit = s.cbegin(); | |
cend() | 返回指向常量末尾后的迭代器 | auto cit = s.cend(); | |
crbegin() | 返回指向常量反向开始的迭代器 | auto crit = s.crbegin(); | |
crend() | 返回指向常量反向末尾后的迭代器 | auto crit = s.crend(); | |
容量管理 | size() | 返回字符串长度 | size_t len = s.size(); |
length() | 返回字符串长度 (同 size() ) | size_t len = s.length(); | |
max_size() | 返回字符串可容纳的最大大小 | size_t maxLen = s.max_size(); | |
resize(size_t n) | 调整字符串大小 | s.resize(10); | |
resize(size_t n, char c) | 调整大小并用字符填充 | s.resize(10, 'x'); | |
capacity() | 返回分配的存储容量 | size_t cap = s.capacity(); | |
reserve(size_t n) | 保留指定容量 | s.reserve(20); | |
clear() | 清空字符串 | s.clear(); | |
empty() | 判断字符串是否为空 | bool isEmpty = s.empty(); | |
shrink_to_fit() | 释放未使用的容量 | s.shrink_to_fit(); | |
元素访问 | operator[] (size_t pos) | 访问指定位置的字符 | char c = s[2]; |
at(size_t pos) | 安全访问指定位置的字符 | char c = s.at(2); | |
back() | 访问最后一个字符 | char c = s.back(); | |
front() | 访问第一个字符 | char c = s.front(); | |
修饰符 | operator+= (const std::string& str) | 追加字符串 | s += s2; |
operator+= (const char* s) | 追加 C 字符串 | s += "Hello"; | |
operator+= (char c) | 追加单个字符 | s += 'A'; | |
append(const std::string& str) | 追加字符串 | s.append(s2); | |
append(const std::string& str, size_t subpos, size_t sublen) | 追加子字符串 | s.append(s2, 1, 3); | |
append(const char* s) | 追加 C 字符串 | s.append("Hello"); | |
append(const char* s, size_t n) | 追加 C 字符串的前 n 个字符 | s.append("Hello", 3); | |
append(size_t n, char c) | 追加 n 个字符 | s.append(5, 'x'); | |
assign(const std::string& str) | 分配字符串 | s.assign(s2); | |
assign(const char* s) | 分配 C 字符串 | s.assign("Hello"); | |
insert(size_t pos, const std::string& str) | 在指定位置插入字符串 | s.insert(3, "ABC"); | |
erase(size_t pos = 0, size_t len = npos) | 删除指定位置的字符 | s.erase(2, 4); | |
replace(size_t pos, size_t len, const std::string& str) | 替换部分字符串 | s.replace(2, 3, "XYZ"); | |
swap(std::string& str) | 交换两个字符串的内容 | s.swap(s2); | |
pop_back() | 删除最后一个字符 | s.pop_back(); | |
字符串操作 | c_str() | 返回 C 字符串指针 | const char* cstr = s.c_str(); |
data() | 返回指向字符串内容的指针 | const char* data = s.data(); | |
copy(char* s, size_t len, size_t pos = 0) | 将字符串复制到字符数组中 | s.copy(arr, 5); | |
find(const std::string& str, size_t pos = 0) | 查找字符串中首次出现的子串 | size_t pos = s.find("Hello"); | |
rfind(const std::string& str, size_t pos = npos) | 查找字符串中最后一次出现的子串 | size_t pos = s.rfind("Hello"); | |
find_first_of(const std::string& str, size_t pos = 0) | 查找字符集中的任意一个字符 | size_t pos = s.find_first_of("aeiou"); | |
find_last_of(const std::string& str, size_t pos = npos) | 查找字符集中最后出现的字符 | size_t pos = s.find_last_of("aeiou"); | |
find_first_not_of(const std::string& str, size_t pos = 0) | 查找第一个不属于字符集的字符 | size_t pos = s.find_first_not_of("aeiou"); | |
find_last_not_of(const std::string& str, size_t pos = npos) | 查找最后一个不属于字符集的字符 | size_t pos = s.find_last_not_of("aeiou"); |
|
| | substr(size_t pos = 0, size_t len = npos)
| 生成子字符串 | std::string sub = s.substr(0, 5);
|
| | compare(const std::string& str)
| 比较两个字符串 | int result = s.compare(s2);
|
| 成员常量 | npos
| 表示 size_t
的最大值 | if (s.find("abc") == std::string::npos) {}
|
| 非成员函数 | operator+
| 字符串连接 | std::string s3 = s1 + s2;
|
| | operator<<
| 插入字符串到输出流 | std::cout << s;
|
| | operator>>
| 从输入流中提取字符串 | std::cin >> s;
|
| | getline()
| 从输入流中读取一行到字符串 | std::getline(std::cin, s);
|
| | swap(std::string& a, std::string& b)
| 交换两个字符串 | std::swap(s1, s2);
|
一、string 是什么?
这是一个模板类:
它用来管理C++中字符类型的数据,字符除了英文数字,还有各国的语言等等(他们有不同字节的大小)
平常我们在使用的时候,用的最多的就是:
以char为数据类型实例化模版basic_string为类类型basic_string,再将basic_stringtypedef为string
二、C++语法补充
1. auto
-
早期C/C++中的
auto
:
在C语言中,auto
用于声明具有自动存储期的局部变量,表示变量在函数调用时自动分配并在函数返回时释放。因为局部变量默认具有自动存储期,所以auto
修饰符不太被使用,逐渐变得不重要。 -
C++11中的
auto
新含义:
C++11标准重新定义了auto
,使其成为一种类型推导机制。编译器根据初始化的表达式,自动推导出变量的类型。例如:auto x = 10; // x 的类型是 int auto y = 3.14; // y 的类型是 double
-
指针和引用:
- 当使用
auto
声明指针时,auto
和auto*
效果相同,编译器自动推导出指针类型:int* ptr = &x; auto p = ptr; // p 的类型是 int*
- 如果要声明引用,必须明确加上
&
:int a = 5; auto& ref = a; // ref 是 a 的引用
- 当使用
-
多个变量声明:
如果在一行中声明多个变量,所有变量必须是相同的类型。因为编译器只推导第一个变量的类型:auto x = 1, y = 2.5; // 错误,x 是 int,y 是 double
改为:
auto x = 1; auto y = 2.5; // 正确
-
函数返回值:
auto
不能用于函数参数类型,但可以用于推导函数返回值类型。不过要注意,这样用可能不直观auto func() {return 42; // 返回类型为 int }
-
数组声明:
不能直接用auto
声明数组,因为数组的大小是编译时必须明确的,编译器无法推导出数组的大小:auto arr[] = {1, 2, 3}; // 错误
2. 范围for
// 范围for C++11 语法糖
// // 适用于容器遍历和数组遍历
// // 自动取容器的数据赋值给左边的对象(仅仅是拷贝了一份,也就是赋值)
// // 自动++,自动判断结束
// // 原理:范围for底层是迭代器
基于范围的for循环概述
C++11引入了基于范围的for循环,主要是为了减少程序员在遍历时的工作量,避免手动设置迭代器或索引,从而简化代码,并降低出错的风险。语法为:
for (元素类型 变量名 : 容器) {// 对变量名进行操作
}
- 第一部分(
元素类型 变量名
):用来保存遍历过程中当前元素的拷贝或引用。 - 第二部分(
容器
):是要遍历的数组或容器。 - 它会自动:
- 迭代元素;
- 提取数据;
- 判断何时结束。
适用范围
范围for可以遍历数组、容器对象(如std::vector
、std::list
等),并且也能遍历自定义的类,只要这些类实现了迭代器接口。
示例代码
-
遍历数组:
int arr[] = {1, 2, 3, 4, 5}; for (int num : arr) {std::cout << num << std::endl; }
-
遍历容器(如
std::vector
):std::vector<int> vec = {10, 20, 30, 40}; for (int val : vec) {std::cout << val << std::endl; }
-
通过引用遍历并修改元素:
如果你希望在遍历时修改容器中的元素,可以使用引用&
:for (int& val : vec) {val *= 2; // 将每个元素都乘以2 }
底层机制
范围for的底层其实会被转换成传统的迭代器形式,相当于以下代码:
for (auto it = container.begin(); it != container.end(); ++it) {auto val = *it; // 取出元素// 循环体
}
它通过容器的begin()
和end()
函数获取迭代器,自动完成遍历操作。从汇编层面来看,它生成的指令与使用迭代器的常规for循环类似,只是更加简洁。
三、string类对象的常见构造
1. Construct string object
语法 | 作用 |
---|---|
string(); | 空的默认构造 |
string (const string& str); | 拷贝构造 |
string (const string& str, size_t pos, size_t len = npos); | 从str第pos个位置拷贝len个长度,超了就拷贝到结尾 |
string (const char* s); | 拷贝一个字符串 |
string (const char* s, size_t n); | 拷贝字符串前n个值 |
string (size_t n, char c); | 拷贝n个’c’字符 |
string (InputIterator first, InputIterator last); | 迭代器,左闭右开,指定迭代器区间 |
2. String destructor
就是string类的析构函数
3. operator=
语法 | 作用 |
---|---|
string& operator= (const string& str); | 可以赋值一个string |
string& operator= (const char* s); | 可以赋值一个数组 |
string& operator= (char c); | 可以赋值一个’c’ |
可以两个对象之间加减 | 也可以 += string或其他字符(串) |
四、string迭代器相关
1. begin与end
1)begin
提供了两个版本,对于普通变量和const变量
返回字符串第一个有效位置的字符的迭代器
2)end
提供了两个版本,对于普通变量和const变量
返回字符串最后一个有效位置的字符的下一个位置的迭代器,string的末尾会加’\0’,而’\0’不算有效字符,因此通常end在’\0’的位置。
如果是空字符,返回与begin一样的值。
3)使用
int main()
{std::string st;st = "hellow world";auto it = st.begin();while (it != st.end()){cout << *it;++it;}cout << endl;
}
int main()
{std::list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);//std::list<int>::iterator it = lt.begin();auto it = lt.begin();while (it != lt.end()){cout << *it;++it;}cout << endl;
}
2. rbegin 与 rend
用于逆转迭代
1)rbegin
返回字符串最后一个有效数据的迭代器
2)rend
返回第一个有效数据的前一个理论元素的迭代器(被认为是字符串的反向结束)。
3)使用
int main()
{std::string st = "hellow world";std::string::reverse_iterator it = st.rbegin();while (it != st.rend()){cout << *it;//相当于反向++了++it;}cout << endl;return 0;
}
五、容量相关
名字 | 作用 |
---|---|
size / length | 返回字符串有效长度 |
max_size | 返回字符产可以到达的最大长度(取决于编译器) |
resize | 使字符串变为n个字符,若变小了,就取前n个元素,销毁后面的。若变大了,在后面插入,若指定了一个字符,就插入该字符,否则初始化为空字符 ———————————————————void resize (size_t n); void resize (size_t n, char c); |
capacity | 返回空间总大小,vs在这里对于小空间有一个数组buffer[16],空间大了就用别的1.5倍率扩容 |
reserve | 为字符串预留空间void reserve (size_t n = 0); |
clear | 清空字符串有效字符,不回收空间 |
empty | 返回bool字符串是否为空 |
shrink_to_fit | 是一个非强制的方法,它向容器的分配器发出内存收缩的请求,但不一定保证能立即释放多余的内存 |
1. resize
使字符串变为n个字符,若变小了,就取前n个元素,销毁后面的。若变大了,在后面插入,若指定了一个字符,就插入该字符,否则初始化为空(‘\0’)字符
int main()
{string s1("11111111111111111111");cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;// 删除// n < sizes1.resize(15);cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;// 插入// size < n < capacitys1.resize(25, 'x');cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;// n > capacitys1.resize(40, 'x');cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}
2. reserve
int main()
{string s1;// 提前开空间,避免扩容s1.reserve(200);return 0;
}
3. 使用
int main()
{try{string s1("hello world11111");cout << s1.size() << endl;cout << s1.length() << endl;cout << s1.max_size() << endl;cout << s1.capacity() << endl;cout << endl << endl;s1.clear();cout << s1.size() << endl;cout << s1.capacity() << endl;//s1[20];s1.at(20);}catch (const exception& e){cout << e.what() << endl;}return 0;
}
六、元素的访问相关
1. operator[]
返回字符串对应位置的字符,有了这个,我们就可以把string的对象当数组用
2. at
和[ ]的作用一样,不过失败(越界访问)了要抛出一个异常,这样接收:
抛出来的是这样一个异常我们用他的父类接收
int main()
{try{string s1("hello world11111");s1.at(20);}catch (const exception& e){cout << e.what() << endl;}return 0;
}
3. back
通过它访问字符串最后一个有效字符
4. front
通过它访问字符串第一个字符
七、 string类对象的修改操作
成员函数 | 功能描述 |
---|---|
operator+= | 将指定的字符串或字符追加到现有字符串末尾。支持 std::string 对象和 C 风格字符串(const char* )的追加操作。 |
append | 向字符串末尾追加内容,支持多种形式:完整字符串、子串、C 风格字符串、字符数组的一部分、重复某个字符等。 |
push_back | 向字符串末尾追加一个单个字符,简洁方便。 |
assign | 替换整个字符串的内容,可以使用另一个字符串、子串、C 风格字符串、字符数组或重复某个字符的方式进行赋值。 |
insert | 在指定位置插入内容,支持插入字符、子串、C 风格字符串或重复某个字符。 |
erase | 从字符串中删除指定位置的字符或字符范围。可以删除单个字符或一段子串。 |
replace | 用指定的内容替换字符串中的某个范围,可以替换子串、C 风格字符串或重复某个字符的部分。 |
swap | 交换两个字符串的内容,不涉及内存拷贝,因此比赋值操作更高效。 |
pop_back | 删除字符串的最后一个字符,减少字符串的长度。 |
1. append
它的作用是在字符串后加入一个字符串。
-
字符串
- 语法:
append(const string& str)
- 例子:
string s = "Hello"; s.append(" World"); // s = "Hello World"
- 语法:
-
字符串的子串
- 语法:
append(const string& str, size_t subpos, size_t sublen)
- 例子:
string s = "Hello"; s.append("World!", 0, 3); // 追加"World!"的前3个字符 // s = "Hello Wor"
- 语法:
-
C风格字符串
- 语法:
append(const char* s)
- 例子:
string s = "Hello"; s.append(" World"); // s = "Hello World"
- 语法:
-
字符数组的一部分
- 语法:
append(const char* s, size_t n)
- 例子:
string s = "Hello"; s.append("World!!!", 5); // 只追加前5个字符 // s = "Hello World"
- 语法:
-
重复指定字符
- 语法:
append(size_t n, char c)
- 例子:
string s = "Hello"; s.append(3, '!'); // s = "Hello!!!"
- 语法:
-
迭代器范围
- 语法:
append(InputIterator first, InputIterator last)
- 例子:
string s = "Hello"; string part = "World"; s.append(part.begin(), part.begin() + 3); // 追加"World"的前3个字符 // s = "Hello Wor"
- 语法:
2. operator+=
可以把字符串和字符加到当前字符串后面
string s3("hello");s3 += ',';s3 += "world";cout << s3 << endl;
3. assign
替换原本的字符串,一功能替换成一下这几种方式
4. insert
任意位置(前)插入,有以下这些插入方法。
5. erase
什么都不传就全删完了
6. replace
相当于assign的升级版,可以只替换一部分。(平替的时候效率很高,一旦个数不同,就牵扯到遍历字符串)
八、对于字符串操作部分
函数名 | 功能 |
---|---|
c_str() | 获取 C 风格字符串的等价物(以 null 结尾的字符数组)。 |
data() | 获取字符串的数据(返回指向字符的指针)。 |
get_allocator() | 获取分配器(返回用于分配存储的 allocator 对象)。 |
copy(char* s, size_t len, size_t pos = 0) | 从字符串中复制字符序列到指定缓冲区。 |
find(const string& str, size_t pos = 0) | 在字符串中查找子字符串的首次出现。 |
rfind(const string& str, size_t pos = npos) | 在字符串中查找子字符串的最后一次出现。 |
find_first_of(const string& str, size_t pos = 0) | 查找字符串中第一个出现的指定字符。 |
find_last_of(const string& str, size_t pos = npos) | 从末尾开始查找字符串中最后一个出现的指定字符。 |
find_first_not_of(const string& str, size_t pos = 0) | 查找字符串中第一个不匹配的指定字符。 |
find_last_not_of(const string& str, size_t pos = npos) | 从末尾开始查找字符串中最后一个不匹配的指定字符。 |
substr(size_t pos = 0, size_t len = npos) | 生成指定位置和长度的子字符串。 |
compare(const string& str) | 比较两个字符串的内容,返回整数结果。 |
1. c_str()
就是把C++的string转换为C语言的const char*
假设我要用c的接口操作文件
string s1("hello world");
cout << s1 << endl;
cout << s1.c_str() << endl;string s2("Test.cpp");
FILE* fout = fopen(s2.c_str(), "r");
char ch = fgetc(fout);
while (ch != EOF)
{cout << ch;ch = fgetc(fout);
}
2. find 与 rfind
size_t find(const string& str, size_t pos = 0) const
- 功能: 在当前字符串中查找子字符串
str
的首次出现位置。 - 参数:
const string& str
: 要查找的子字符串。size_t pos
: 开始查找的位置(默认为 0)。
- 返回值: 如果找到,返回子字符串的起始索引;如果未找到,返回
std::string::npos
。
示例:
std::string str = "Hello, world!";
size_t pos = str.find("world"); // 返回 7
rfind就是倒着找
find_first_of 是比如给了 ” aeiou“,就找第一个出现任意一个这里面字符的下标
find_last_of 就是 find_first_of 倒着找
find_first_not_of 是比如给了 ” aeiou“,就找第一个不
出现一个这里面字符的下标
find_last_not_of 就是 find_first_not_of 倒着找
3. substr
从第pos个位置获取 len 个字串,不指定len,就从pos位置开始全部获取
九、非成员函数函数重载
1. operator+
做加法就好
2. operator<< 与 orerator >>
3. getline
用cin输入的时候默认空格和回车会结束到下一个。
getline默认回车到下一个,也可以自定义结束符。
int main()
{string str;//cin >> str;//getline(cin, str, '#');getline(cin, str);return 0;
}
总结
到这里,string用法的讲解就结束啦~
谢谢大家~
相关文章:

C++:string (用法篇)
文章目录 前言一、string 是什么?二、C语法补充1. auto2. 范围for 三、string类对象的常见构造1. Construct string object2. String destructor3. operator 四、string迭代器相关1. begin与end1)begin2)end3)使用 2. rbegin 与 r…...
力扣随机题
最接近原点的K个点 题目 973. 最接近原点的 K 个点 - 力扣(LeetCode) 思路 这就是一道排序题,直接根据公式排序,然后返回对应范围的数组就行了 代码 public int[][] kClosest(int[][] points, int k) {Arrays.sort(points, n…...

CSS样式基础样式选择器(案例+代码实现+效果图)
目录 1.css样式的规则 2.引入css样式的方式 1)行内式 2)内嵌式 3)外链式 1-link导入 2-import导入 4)总 3.css基础选择器 1)标签选择器 案例:使用标签选择器编写一个圆 1.代码 2.效果 2)类选择器 案例:使用类选择器为div添加背景色 1.代码 2.效果 3)id…...
Linux系统编程—I/O缓冲区(C语言实现)
I/O缓冲区 进程的I/O缓冲区机制是计算机操作系统中一个重要的概念,它涉及到数据在内存和外设之间的传输。以下是关于进程的I/O缓冲区机制的详细解释: 1.定义与作用 定义:I/O缓冲区是指在内存里开辟的一块区域,用来存放接收用户输…...

MySQL多表查询:行子查询
先看我的表数据 dept表 emp表 行子查询 子查询返回的结果是一行(可以是多列), 这种子查询称为行子查询 常用的操作符: , <>, IN, NOT IN 例子1. 查询与“张无忌” 的薪资及直属领导相同的员工信息 拆解成两个问题 a. 查询"张无忌"…...

.NET CORE程序发布IIS后报错误 500.19
发布IIS后浏览时报错误500.19,同时配置文件web.config的路径中也存在问号“?”。 可能原因:没有安装运行时...
Qt 6 相比 Qt 5 的主要提升与更新
自从 Qt 6 发布以来,作为 Qt 框架的一个重大版本更新,它在多个核心方面进行了深度优化和改进。与 Qt 5 相比,Qt 6 不仅提升了性能,还改进了对现代硬件和图形 API 的支持,并增强了开发者的工作流程。本文将详细介绍 Qt …...
【数据结构】介绍
介绍数据结构 数据结构是计算机科学中重要的概念,是指组织和管理数据的方式。它涉及到数据的存储、操作和访问等操作。数据结构可以分为线性结构、树形结构和图形结构等。 线性结构是最简单的数据结构之一(本玄也是这样觉得(* ̄▽ ̄*))&#…...
论医疗类系统全国运营推广策略
一、线上推广 搜索引擎优化(SEO)- 重点策略 持续更新网站内容,包括系统功能介绍、成功案例、行业新闻等,提高网站的权重和流量。进行搜索引擎优化(SEO),确定与医疗机构辅助系统相关的关键词&a…...

Redis入门第一步:认识Redis与快速安装配置
认识Redis与快速安装配置🍃 Redis是什么🐲 1.Redis的背景🎍 Redis(Remote Dictionary Server)译为"远程字典服务",它是一款基于内存实现的键值型 NoSQL 数据库, 通常也被称为数据结…...

ES postman操作全量修改,局部修改,删除
全量修改 修改需要调用的url 地址是http://192.168.1.108:9200/shopping/_doc/1001,调用方法使用put 只修改指定的需求的内容的请求方式 post方式就是局部修改 http://192.168.1.108:9200/shopping/_update/1001,请求方式post 上图是只修改id 为1001数…...

社区交流礼仪 | 提问的艺术
唠唠闲话 2021 年通过 Julia 社区了解到开源,自此开始融入开源社区,学习和体验这种独特的协作模式与交流文化,受益良多。本篇文章为开源新手必读,文章中探讨的交流模式,不仅对参与开源项目的协作有所帮助,…...
极客兔兔Gee-Cache Day5
HTTPPool 既可以是服务端,也可以是客户端,这取决于特定的使用场景和上下文: 作为客户端:当本地缓存没有找到需要的数据时,HTTPPool 需要作为客户端,通过 httpGetter (实现了 PeerGetter 接口&am…...

【IPv6】IPv6地址格式及地址分类(组播、单播、任播)整理
IPv6地址格式 IPv6 地址从 IPv4 地址的 32 bits 扩展到 128 bits,IPv6 地址的表示、书写方式也从 IPv4 的点分十进制,修改16进制的冒号分割 IPv4 点分格式(.) 192.168.11.11 IPv6 冒号分割(:) 2408:8459:3032:0000:0000:0000:0001:a9fd IPv6 的规范…...

Linux数据备份
1、Linux服务器中哪些数据需要备份 1)Linux系统重要数据: ①/root/目录,管理员家目录 ②/home/目录,普通用户家目录 ③/etc/目录 ,系统重要的配置文件保存目录 2)安装服务的数据:例apache①…...

回到原点再出发
原文What Goes Around Comes Around作者Michael Stonebraker & Joseph M. Hellerstein其他译文https://zhuanlan.zhihu.com/p/111322429 1. 摘要 本文总结了近35年来的数据模型方案,分成9个不同的时代,讨论了每个时代的方案。我们指出,…...

SimpleFoc以及SVPWM学习补充记录
SimpleFoc SimpleFOC移植STM32(一)—— 简介 FOC控制的过程是这样的: 对电机三相电流进行采样得到 Ia,Ib,Ic。将 Ia,Ib,Ic 经过Clark变换得到 I_alpha I_beta。将 I_alpha I_beta 经过Park变换得到 Id,Iq。计算 Id,Iq 和其设定值 Id_ref 和…...

免费 Oracle 各版本 离线帮助使用和介绍
文章目录 Oracle 各版本 离线帮助使用和介绍概要在线帮助下载离线文档包:解压离线文档:访问离线文档:导航使用:目录介绍Install and Upgrade(安装和升级):Administration(管理&#…...

刷题 二叉树
二叉树的核心思想 - 递归 - 将问题分解为子问题 题型 递归遍历迭代遍历层序遍历 bfs:队列各种递归题目:将问题分解为子问题二叉搜索树 - 中序遍历是递增序列 TreeNode* &prev 指针树形dp 面试经典 150 题 - 二叉树 104. 二叉树的最大深度 广度优…...

操作系统 | 学习笔记 | 王道 | 4.1 文件系统基础
4.文件管理 4.1 文件系统基础 4.1.1 文件的基本概念 定义 文件是以计算机硬盘为载体的存储在计算机上的信息集合,在用户进行的输入、输出中,以文件位基本单位。 文件管理系统是实现的文件的访问、修改和保存,对文件维护管理的系统。 文件的…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...