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 文件的基本概念 定义 文件是以计算机硬盘为载体的存储在计算机上的信息集合,在用户进行的输入、输出中,以文件位基本单位。 文件管理系统是实现的文件的访问、修改和保存,对文件维护管理的系统。 文件的…...

var let const 之间的区别
在JavaScript中,var、let 和 const 是用于声明变量的三种关键字。它们之间有几个重要的区别: 1. 作用域 var: 声明的变量具有函数作用域,即在整个函数内都可以访问。如果在代码块内(如if或for)使用var,该…...

【springboot】简易模块化开发项目整合Swagger2
接上一项目【springboot】简易模块化开发项目整合MyBatis-plus,进行拓展项目 1.新建模块 右键项目→New→Module,新建一个模块 父项目选择fast-demo,命名为fast-demo-config,用于存放所有配置项 添加后,项目结构如图…...

【Linux第五课-进程概念下】环境变量、程序地址空间
目录 环境变量main参数 --- 命令行参数环境变量环境变量特性 --- 命令行操作main函数的参数获取环境变量environ获取环境变量getenv()获取环境变量unset移除本地变量或环境变量set显示本地变量 代码获取和设置环境变量 本地变量 程序地址空间什么是进程地址空间为什么有地址空间…...

mysql学习教程,从入门到精通,SQL 临时表(37)
1、SQL 临时表 在SQL中,临时表(Temporary Table)是一种在会话或连接期间临时存储数据的表。它们对于存储中间结果、简化复杂查询以及提高性能非常有用。以下是一个创建和使用临时表的示例。 假设我们有一个名为 employees 的表,…...

算法闭关修炼百题计划(四)
仅供个人复习 1.两数相加2.寻找峰值6.岛屿的最大面积3.最大数4.会议室5.最长连续序列6.寻找两个正序数组的中位数 1.两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请…...

头歌实践教学平台 大数据编程 实训答案(二)
第三阶段 Spark算子综合案例 Spark算子综合案例 - JAVA篇 第1关:WordCount - 词频统计 任务描述 本关任务:使用 Spark Core 知识编写一个词频统计程序。 相关知识 略 编程要求 请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下: …...

路由交换实验指南
案例 01:部署使用 eNSP 平台实验需求: 安装华为 eNSP 网络模拟平台打开 eNSP 平台,新建拓扑并绘制网络能够成功启动交换机、计算机设备 实验步骤: 安装华为 eNSP 网络模拟平台启动安装程序 配置安装内容 防护墙允许 eNSP 程序的…...

了解网页 blob 链接
blob 链接 自从 HTML5 提供了 video 标签,在网页中播放视频变得非常简单,只要在代码中插入一个 video 标签,再将 video 标签的 src 属性设置为视频的链接就可以了。由于 src 指向的是视频文件真实的地址,所以当我们通过浏览器的调…...

OpenGL笔记之事件驱动设计将相机控制类和应用程序类分离
OpenGL笔记之事件驱动设计将相机控制类和应用程序类分离 —— 2024-10-02 下午 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记之事件驱动设计将相机控制类和应用程序类分离1.代码图片2.分析3.UML4.代码 1.代码图片 运行 Mouse button 1 pressed at (1…...

低代码时代的企业信息化:规范与标准化的重要性
在当今数字化转型的浪潮中,企业的信息化建设正逐步向低代码平台倾斜。低代码不仅仅是简化开发过程,更是对企业内部流程、规范和标准化的深刻理解与应用。本文将探讨低代码在企业信息化中的重要性,特别是在运维和开发流程中的标准化࿰…...