C++初阶 -- 初识STL和string类详细使用接口的教程(万字大章)
目录
一、STL
1.1 什么是STL
1.2 STL的版本
1.3 STL的六大组件
二、string类
2.1 string类的基本介绍
2.2 string类的默认成员函数
2.2.1 构造函数
2.2.2 析构函数
2.2.3 赋值运算符重载
2.3 string类对象的容量操作
2.3.1 size和length
2.3.2 capacity
2.3.3 reserve和resize
2.3.3.1 reserve
2.3.3.2 resize
2.3.4 empty
2.3.5 clear
2.4 string类的迭代器(iterator)
2.4.1 介绍
2.4.2 begin和end(正向迭代器和const正向迭代器)
2.4.3 rbegin和rend(逆向迭代器和const逆向迭代器)
2.5 string类对象的访问及遍历操作
2.5.1 operator[]
2.5.2 at
2.5.3 范围for循环
2.5.4 使用迭代器iterator(推荐使用)
2.6 string类对象的修改操作
2.6.1 Push_back
2.6.2 append
2.6.3 operator+=(最常用的尾插方法)
2.6.4 c_str
2.6.5 npos
2.6.6 find
2.6.7 rfind
2.6.8 substr
2.6.9 erase
2.6.10 insert(效率很低,能不用就不用)
注意:
2.7 有关string类的迭代器的补充
2.7.1 string类迭代器的底层实现
2.7.2 范围for循环与迭代器iterator的关系
一、STL
1.1 什么是STL
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
1.2 STL的版本
- 原始版本
Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本--所有STL实现版本的始祖。
P. J. 版本
由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异。
RW版本
由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。
SGI版本
由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码,主要参考的就是这个版本。
1.3 STL的六大组件
二、string类
2.1 string类的基本介绍
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
总结:
- string是表示字符串的字符串类
- 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
- string在底层实际是:basic_string模板类的别名, typedef basic_string<char, char_traits, allocator>string; string类是basic_string模板类的一个实例
- 不能操作多字节或者变长字符的序列。
2.2 string类的默认成员函数
(constructor)构造函数 | Construct string object (public member function ) |
(destructor)析构函数 | String destructor (public member function ) |
(operator=) 赋值运算符重载 | String assignment (public member function ) |
2.2.1 构造函数
string类常见的构造函数
(constructor)函数名称 | 功能说明 |
---|---|
string() (重点) | 构造空的string类对象,即空字符串 |
string(const char* s) (重点) | 用C-string(c风格的字符串)来构造string类对象 |
string(size_t n, char c) | string类对象中包含n个字符c(用n个字符c来构造string类对象) |
string(const string&s) (重点) | 拷贝构造函数 |
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;int main()
{string s1;string s2("aa aaa bbbbb");string s3(s2); string s4(10, 'c');cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl; return 0;
}
2.2.2 析构函数
销毁string对象
2.2.3 赋值运算符重载
分配一个新的值的string类对象来代替当前的容器
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("aa aaa bbbbb");string s2(10, 'c');cout << s1 << endl;cout << s2 << endl;return 0;
}
2.3 string类对象的容量操作
函数名称 | 功能说明 |
---|---|
size(重点)(常用) | 返回字符串有效字符长度 |
length | 返回字符串有效字符长度 |
capacity | 返回空间总大小 |
empty(重点) | 检测字符串是否为空串,是返回true,否则返回false |
clear(重点) | 清空有效字符 |
reserve(重点) | 为字符串预留空间 |
resize(重点) | 将有效字符的个数该成n个,多出的空间用字符c填充 |
2.3.1 size和length
这两个函数都是返回当前对象的有效字符长度。
由于历史的种种原因,还是推荐使用size()函数。
int main()
{string s2("aa aaa bbbbb");cout << s2.size() << endl;cout << s2.length() << endl;return 0;
}
2.3.2 capacity
-
格式:size_t capacity() const
- 返回值:返回当前为字符串分配的存储空间的大小
int main()
{string s1("hello");cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}
注意一个问题:当构建一个空string类对象时,它的容量是0还是其他数?
- 通过上图可以看出,在VS2022下默认会给生成的字符串对象开辟15字节的空间(由于编译器的不同,默认开辟的空间大小也会不同)。Linux的g++环境下默认不给对象开辟空间。
- 当字符串添加新字符后,字符串当前长度大于原本为其开辟的空间。对象就会自动扩容(即重新分配空间)。
- 在VS2022下,string类对象自动扩容是按照原大小的1.5倍进行扩容。在不同的编译器下,扩容的倍数也会不同。Linux下的g++环境按照原大小的两倍进行扩容。
- capacity函数返回的是当前对象的空间大小,但由于在c/c++中'\0'并不是有效字符,所以capacity函数并没有将'\0'算进去。所以对象实际的空间大小应该在原有的基础上多加1字节,因为字符串的末尾还有个'\0'.
2.3.3 reserve和resize
2.3.3.1 reserve
- 格式:void reserve (size_t n = 0)
- 返回值:None
请求根据计划改变字符串容量,长度最多为n个字符。(只影响容量,不影响数据)
对于reserve函数,可以有两种改变容量的情况。一个是扩容,另一个则是缩容。
1、扩容
int main()
{string s1;// reserve()的使用最好是已经确定需要多少空间,根据需求开好空间即可s1.reserve(100);size_t old = s1.capacity();cout << old << endl;for (size_t i = 0; i < 100; i++){s1.push_back('x');if (old != s1.capacity()){old = s1.capacity();cout << old << endl;}}return 0;
}
2、 缩容
在VS2022下是不会发生缩容的,但是在Linux的g++环境下就会发生缩容,最多只能缩到对象的size()。
int main()
{string s1("hello");s1.reserve(1);cout << s1.size() << endl;cout << s1.capacity() << endl;cout << s1 << endl;return 0;
}
2.3.3.2 resize
-
格式:void resize (size_t n) 或 void resize (size_t n, char c)
-
返回值: None
将字符串的大小改为n个字符c的长度。(既影响容量,也影响数据)
注意:有关容量大小n的问题
1、如果n小于当前字符串的长度,则当前值将缩短为其前n个字符并删除第n个字符以外的字符。
int main()
{string s1("hello");cout << s1.size() << endl;cout << s1.capacity() << endl;cout << s1 << endl;// n < size --> 将容量缩短为前n个字符,并删除第n个字符以外的字符s1.resize(3);cout << s1.size() << endl;cout << s1.capacity() << endl;cout << s1 << endl;return 0;
}
2、如果n大于当前字符串存储空间的大小,则通过在末尾插入所需数量的字符来扩展当前内容,以到达n的大小。如果指定了补充的字符为c,则新元素将初始化为c的副本。否则,它们的值将初始化为空字符('\0')。
int main()
{string s1("hello");cout << s1.size() << endl;cout << s1.capacity() << endl;cout << s1 << endl;// n > capacity --> 不指定字符,默认插入空字符'\0'并扩容到n个字节s1.resize(100);cout << s1.size() << endl;cout << s1.capacity() << endl;cout << s1 << endl;return 0;
}
3、 如果n小于当前字符串的存储空间的大小且大于当前字符串有效字符的个数,会将当前字符串有效字符的个数的位置的后面的空间全部设置为字符 c。
int main()
{string s1("hello");cout << s1.size() << endl;cout << s1.capacity() << endl;cout << s1 << endl;// size < n < capacity --> 不指定字符,默认插入n个空字符'\0'。但不扩容s1.resize(8);cout << s1.size() << endl;cout << s1.capacity() << endl;cout << s1 << endl;return 0;
}
2.3.4 empty
- 格式:bool empty() const
- 返回值:如果字符串长度为0就返回true,否则返回true
int main()
{string s1;cout << s1.empty() << endl;string s2 = "aaaaaa";cout << s2.empty() << endl;return 0;
}
2.3.5 clear
-
格式: void clear()
-
返回值:None
清空字符串内的有效字符,但并不会影响底层空间的大小
int main()
{string s2 = "aaaaaa";s2.clear();cout << s2.empty() << endl;return 0;
}
总结:
- size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
- clear()只是将string中有效字符清空,不改变底层空间大小。
- resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
- reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。
2.4 string类的迭代器(iterator)
2.4.1 介绍
在C++中,迭代器(lterator) 是一种设计模式,它提供了一种统一的方式来遍历容器(如vector、list、map 等)中的元素,而无需暴露容器的内部实现细节。迭代器的行为类似于指针,允许你逐个访问容器中的元素。
迭代器名称 | 迭代器的作用 |
---|---|
begin + end | begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器 |
rbegin + rend | rbegin获取最后一个字符的迭代器 + rend获取一个字符的前一个位置的迭代器 |
string类提供了不同类型的迭代器:
- 正向迭代器(iterator):遍历可修改字符串的迭代器
- 常属性正向迭代器(const_iterator):只能读取字符串的元素不能修改的迭代器
- 反向迭代器(reverse_iterator):逆向遍历字符串
- 常属性反向迭代器(const_reverse_iterator):只能逆向读取字符串中的元素不能修改的迭代器
2.4.2 begin和end(正向迭代器和const正向迭代器)
begin:获取第一个字符的迭代器
const_begin:获取第一个字符但不能修改的迭代器
end获取最后一个字符下一个位置的迭代器(类似于哨兵)
const_end:获取最后一个字符下一个位置但不能修改的迭代器
int main()
{string s1 = "abcdefghijk";string::iterator sit = s1.begin();string::iterator eit = s1.end();// 利用迭代器遍历字符串while (sit != eit){cout << *sit << " ";++sit;}return 0;
}
2.4.3 rbegin和rend(逆向迭代器和const逆向迭代器)
用法类似于正向迭代器begin和end以及const正向迭代器const_reverse_iterator和const_reverse_iterator,但方向是相反的。
2.5 string类对象的访问及遍历操作
函数名称 | 功能说明 |
---|---|
operator[](重点) | 返回pos位置的字符,const string类或string类对象都可以调用 |
begin + end | begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器 |
rbegin + rend | rbegin获取最后一个字符下一个位置的迭代器 + rend获取一个字符的迭代器 |
范围for | C++11支持更简洁的范围for的新遍历方式 |
2.5.1 operator[]
得到字符串中的字符,但要注意的是返回值的类型是char&。说明使用operator[]不仅可以访问字符串中的字符,还可以修改字符。
int main()
{string s1 = "abcdefghijk";cout << s1[0] << endl; // 访问字符串s1的第一个字符s1[0] = '0'; // 修改字符串s1的第一个字符cout << s1[0] << endl; // 访问字符串s1的第一个字符return 0;
}
2.5.2 at
at和operator[]的功能是一样的,唯一的区别就是处理越界的方式不同。
int main()
{try{string s1("hello world");cout << s1[11] << endl;}catch (const exception& e){cout << e.what() << endl;}return 0;
}
为什么访问数组的下标已经越界,却不报错?
原因在于还有一个字符'\0',在C++中还是允许访问的。
1、operator[]处理越界的方法
int main()
{try{string s1("hello world");cout << s1[20] << endl;}catch (const exception& e){cout << e.what() << endl;}return 0;
}
2、at()处理越界的方法
int main()
{try{string s1("hello world");cout << s1.at(20) << endl;}catch (const exception& e){cout << e.what() << endl;}return 0;
}
2.5.3 范围for循环
int main()
{string s1 = "abcdefghijk";// 遍历字符串 -- 搭配auto关键字一起使用for (auto& c : s1){cout << c << " ";}return 0;
}
2.5.4 使用迭代器iterator(推荐使用)
int main()
{string s1 = "abcdefghijk";string::iterator sit = s1.begin();string::iterator eit = s1.end();// 利用迭代器遍历字符串while (sit != eit){cout << *sit << " ";++sit;}return 0;
}
2.6 string类对象的修改操作
函数名称 | 功能说明 |
---|---|
push_back | 在字符串后尾插字符c |
append | 在字符串后追加一个字符串 |
operator+= (重点) | 在字符串后追加字符串str |
c_str (重点) | 返回C格式字符串 |
find + npos(重点) | 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置 |
rfind | 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置 |
substr | 在str中从pos位置开始,截取n个字符,然后将其返回 |
2.6.1 Push_back
-
格式:void push_back (char c);
-
用法:在字符串末尾尾插字符c。
int main()
{string s1 = "abcdefghijk";cout << s1 << endl;s1.push_back('2');cout << s1 << endl;return 0;
}
2.6.2 append
int main()
{string s1 = "hello";string s2 = "world";s1.append(" ");s1.append(s2);cout << s1 << endl;return 0;
}
2.6.3 operator+=(最常用的尾插方法)
将str的内容追加到当前字符串的末尾
int main()
{string s1 = "hello";string s2 = "world";s1 += " ";s1 += s2;cout << s1 << endl;return 0;
}
2.6.4 c_str
返回指向一个不可修改数组的指针,该数组包含以null结尾的字符序列(即C字符串),表示字符串对象的当前值。
int main()
{string filename("Test.cpp");FILE* fout = fopen(filename.c_str(), "r");char ch = fgetc(fout);while (ch != EOF){cout << ch;ch = fgetc(fout);}return 0;
}
2.6.5 npos
在谈及下一个函数前,先得了解一个数值,他的名叫npos
npos是一个静态且不可被修改的无符号整数,它表示无符号整型的最大值(-1)。
2.6.6 find
寻找在字符串中的内容
注意:如果找到目标内容就返回目标的下标,如果没找到目标则返回npos。
int main()
{string s1 = "hello";cout << s1.find("e") << endl;cout << s1.find("d");return 0;
}
2.6.7 rfind
返回最后一个匹配字符/字符串的位置,整体与find相似。
2.6.8 substr
返回一个新构造的string对象,它的初始值为当前字符串的子字符串(在str中从pos位位置开始,截取n个字符)。
int main()
{string s1 = "hello";cout << s1.substr(0 , 4) << endl;return 0;
}
2.6.9 erase
删除字符串的一部分,减少字符串的长度。
int main()
{string s1("hello world");string s2("xxx");s1.erase(3, 2);cout << s1 << endl;s1.erase(3);cout << s1 << endl;s2.erase();cout << s2 << endl;return 0;
}
2.6.10 insert(效率很低,能不用就不用)
insert函数由于每次插入数据时都得挪动字符串中的数据,导致内存占用时间过长。所以非必要就不要使用insert函数。
一些常用的重载
int main()
{string s1("hello world");string s2("xxx");s1.insert(s1.begin(), 1, '3');cout << s1 << endl;s1.insert(0, 1, 'x');cout << s1 << endl;return 0;
}
int main()
{string s1("hello world");string s2("xxx");s1.insert(0, s2);cout << s1 << endl;s1.insert(5, s2, 2, 4);cout << s1 << endl;s1.insert(5, "p");cout << s1 << endl;return 0;
}
注意:
- 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
- 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。
2.7 有关string类的迭代器的补充
2.7.1 string类迭代器的底层实现
typedef char* iterator;
typedef const char* const_iterator;// 非const版本的迭代器
iterator begin()
{return _str;
}iterator end()
{return _str + _size;
}
2.7.2 范围for循环与迭代器iterator的关系
int main()
{string s1("hello world");string::iterator it = s1.begin();while (it != s1.end()){cout << *it << " ";it++;}cout << endl;// 范围for循环实际上是傻瓜式替换为迭代器for (auto ch : s1){cout << ch << " ";}
}
从结果上看,范围for循环的结果跟用迭代器iterator的结果是一样的。那是不是它们的底层实现逻辑也是一样的?
实际上是这样的,范围for循环实际上就是傻瓜式替换为迭代器。
只要将任意一个迭代器改名了,那范围for循环就使用不了了。
typedef char* Iterator;
typedef const char* const_iterator;// 非const版本的迭代器
Iterator begin()
{return _str;
}Iterator end()
{return _str + _size;
}
相关文章:
C++初阶 -- 初识STL和string类详细使用接口的教程(万字大章)
目录 一、STL 1.1 什么是STL 1.2 STL的版本 1.3 STL的六大组件 二、string类 2.1 string类的基本介绍 2.2 string类的默认成员函数 2.2.1 构造函数 2.2.2 析构函数 2.2.3 赋值运算符重载 2.3 string类对象的容量操作 2.3.1 size和length 2.3.2 capacity 2.3.3 r…...
Cursor 背后的技术栈:从 VS Code 到 AI 集成
引言 在当今快速发展的软件开发领域,开发者工具正在经历一场由人工智能(AI)驱动的革命。Cursor 作为一款新兴的智能编程助手,凭借其强大的 AI 能力和高效的开发体验,迅速吸引了大量开发者的关注。Cursor 不仅继承了 V…...
ESP32和STM32在处理中断方面的区别
为了通俗地讲解ESP32和STM32在处理中断方面的区别,我们可以把它们想象成两个不同的“智能管家”系统,各自负责管理一个家庭(即嵌入式项目)的各种任务。我们将重点放在如何处理突发事件(即中断)上。 ESP32 …...
99.23 金融难点通俗解释:小卖部经营比喻PPI(生产者物价指数)vsCPI(消费者物价指数)
目录 0. 承前1. 简述:价格指数对比2. 比喻:两大指数对比2.1 简单对比2.2 生动比喻 3. 实际应用3.1 价格传导现象 4. 总结5. 有趣的对比6. 数据获取实现代码7. 数据可视化实现代码 0. 承前 本文主旨: 本文使用小卖部比喻PPI和CPI,…...
计算机网络概述
1. 计算机网络的定义 计算机网络是指由多个通过物理介质或无线方式互相连接的计算设备组成的系统。其主要目的是实现数据的传输和资源共享。网络中的计算设备可以包括台式机、笔记本电脑、服务器、手机、打印机、智能设备等。 网络的广义定义 首先要理解“网络”的广义含义。网…...
169 多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 class Solution { public int majorityElement(int[] nums) { // 存储每个数字的…...
线程配置经验
工作时,时常会遇到,线程相关的问题与解法,本人会持续对开发过程中遇到的关于线程相关的问题及解决记录更新记录在此篇博客中。 目录 一、线程基本知识 1. 线程和进程 二、问题与解法 1. 避免乘法级别数量线程并行 1)使用线程池…...
算法随笔_34: 最后一个单词的长度
上一篇:算法随笔_33: 132模式-CSDN博客 题目描述如下: 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入&am…...
java 正则表达式匹配Matcher 类
Matcher 类 用法 在 Java 中,Matcher 类是用于匹配正则表达式的工具,而 group() 方法是 Matcher 类中的一个重要方法,用于提取匹配结果中的捕获组(captured groups)。以下是对 group() 方法的详细解释: 1.…...
【Blazor学习笔记】.NET Blazor学习笔记
我是大标题 我学习Blazor的顺序是基于Blazor University,然后实际内容不完全基于它,因为它的例子还是基于.NET Core 3.1做的,距离现在很遥远了。 截至本文撰写的时间,2025年,最新的.NET是.NET9了都,可能1…...
python 使用Whisper模型进行语音翻译
目录 一、Whisper 是什么? 二、Whisper 的基本命令行用法 三、代码实践 四、是否保留Token标记 五、翻译长度问题 六、性能分析 一、Whisper 是什么? Whisper 是由 OpenAI 开源的一个自动语音识别(Automatic Speech Recognition, ASR)系统。它的主要特点是: 多语言…...
pytorch实现循环神经网络
人工智能例子汇总:AI常见的算法和例子-CSDN博客 PyTorch 提供三种主要的 RNN 变体: nn.RNN:最基本的循环神经网络,适用于短时依赖任务。nn.LSTM:长短时记忆网络,适用于长序列数据,能有效解决…...
侯捷 C++ 课程学习笔记:深入理解 C++ 核心技术与实战应用
目录 引言 第一章:C 基础回顾 1.1 C 的历史与发展 1.2 C 的核心特性 1.3 C 的编译与执行 第二章:面向对象编程 2.1 类与对象 2.2 构造函数与析构函数 2.3 继承与多态 第三章:泛型编程与模板 3.1 函数模板 3.2 类模板 3.3 STL 容器…...
大厂面试题备份20250131
20250131 模型压缩怎么做?除了知识蒸馏 模型压缩是为了减少深度学习模型的计算和存储需求,提高推理效率。除了知识蒸馏,常见的模型压缩方法包括: 1. 剪枝(Pruning) 非结构化剪枝(Unstructur…...
(三)QT——信号与槽机制——计数器程序
目录 前言 信号(Signal)与槽(Slot)的定义 一、系统自带的信号和槽 二、自定义信号和槽 三、信号和槽的扩展 四、Lambda 表达式 总结 前言 信号与槽机制是 Qt 中的一种重要的通信机制,用于不同对象之间的事件响…...
玩转大语言模型——配置图数据库Neo4j(含apoc插件)并导入GraphRAG生成的知识图谱
系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用GraphRAGOllama构建知识图谱 玩转大语言模型——完美解决Gra…...
从0开始,来看看怎么去linux排查Java程序故障
一,前提准备 最基本前提:你需要有liunx环境,如果没有请参考其它文献在自己得到local建立一个虚拟机去进行测试。 有了虚拟机之后,你还需要安装jdk和配置环境变量 1. 安装JDK(以OpenJDK 17为例) 下载JDK…...
Java实现LFU缓存策略实战
LFU算法原理在Java中示例实现集成Caffeine的W-TinyLFU策略缓存实战总结LFU与LRU稍有不同,LFU是根据数据被访问的频率来决定去留。尽管它考虑了数据的近期使用,但它不会区分数据的首次访问和后续访问,淘汰那些访问次数最少的数据。 这种缓存策略主要用来处理以下场景: 数据…...
LeetCode--84. 柱状图中最大的矩形【单调栈】
84. 柱状图中最大的矩形 正文 题目如下 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 这道题暴力很简单,但是时间复杂度是O(N^2)…...
感悟人生路
匆匆复匆匆,新春时光沙漏里,过了又来,只是那时和此时。累了,行过百公里,灯光交汇处,都是向往幸福之所。一路长虹,速度跟上节奏,福祉盈门,出入平安。 跨越时空ÿ…...
Autogen_core源码:_agent_instantiation.py
目录 _agent_instantiation.py代码代码解释代码示例示例 1:使用 populate_context 正确设置上下文示例 2:尝试在上下文之外调用 current_runtime 和 current_agent_id示例 3:模拟 AgentRuntime 使用 AgentInstantiationContext _agent_instan…...
开源智慧园区管理系统如何重塑企业管理模式与运营效率
内容概要 在如今快速发展的商业环境中,企业面临着日益复杂的管理挑战。开源智慧园区管理系统应运而生,旨在通过技术创新来应对这些挑战。它不仅是一个简单的软件工具,而是一个全面整合大数据、物联网和智能化功能的综合平台,为企…...
网络工程师 (9)文件管理
一、树形目录结构 (一)定义与构成 树形目录结构由一个根目录和若干层子文件夹(或称为子目录)组成,它像一棵倒置的树。这棵树的根称为根文件夹(也叫根目录),从根向下,每一…...
Java小白入门教程:内置数据类型(四类八种)和引用数据类型
目录 一、内置数据类型(四类八种) 1. 整数类型(四种子类型) 2. 浮点类型(两种子类型) 3. 字符类型(一种子类型) 4. 布尔类型(一种子类型) 二、引用数据类…...
pytorch图神经网络处理图结构数据
人工智能例子汇总:AI常见的算法和例子-CSDN博客 图神经网络(Graph Neural Networks,GNNs)是一类能够处理图结构数据的深度学习模型。图结构数据由节点(vertices)和边(edges)组成&a…...
CRC校验详解
CRC校验即循环冗余校验(Cyclic Redundancy Check),是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误。首先看两个概念,后续会用到。 模2除法:也叫模2运算,就是结果除以2后取余数。模2除法每一位除的结果不影响其它位,即不向上一位借位,所以实际…...
使用where子句筛选记录
默认情况下,SearchCursor将返回一个表或要素类的所有行.然而在很多情况下,常常需要某些条件来限制返回行数. 操作方法: 1.打开IDLE,加载先前编写的SearchCursor.py脚本 2.添加where子句,更新SearchCursor()函数,查找记录中有<>文本的<>字段 with arcpy.da.Searc…...
人工智能导论--第1章-知识点与学习笔记
请根据教材内容,完成进行下面的作业任务。必须包含有教材的具体内容,不能是生成式AI系统的生成内容。 参考教材1.1节的内容介绍,谈谈你对“智能”的认识。思维能力是智能的重要特征之一,结合教材1.1.2节内容,从思维的…...
半导体SAP管理系统:数字化转型的驱动力
在当今全球科技竞争日益激烈的背景下,半导体行业作为信息技术的基石,其生产效率、质量控制和成本优化直接关系到企业的市场竞争力和可持续发展。随着数字化转型的深入,半导体企业纷纷寻求高效、智能的管理系统以提升运营效率。SAP管理系统&am…...
Cursor 简介:AI 如何改变编程体验
在软件开发领域,效率和质量始终是开发者们追求的目标。随着人工智能技术的飞速发展,编程工具也在不断进化,Cursor 便是这一趋势下的产物。它不仅仅是一个代码编辑器,更是一个集成了 AI 能力的智能编程助手,旨在通过 AI…...
苯乙醇苷类化合物的从头生物合成-文献精读108
Complete pathway elucidation of echinacoside in Cistanche tubulosa and de novo biosynthesis of phenylethanoid glycosides 管花肉苁蓉中松果菊苷全生物合成途径解析及苯乙醇苷类化合物的从头生物合成 摘要 松果菊苷(ECH)是最具代表性的苯乙醇苷…...
CSS:跑马灯
<div class"swiper-container"><div class"swiper-wrapper"><!-- 第一组 --><div class"item" v-for"item in cardList" :key"first-item.id"><img :src"item.image" alt""…...
简单的爱心跳动表白网页(附源码)
一:准备工作 在开始之前,确保已经具备基础的 HTML、CSS 和 JavaScript 知识。同时,也要准备好一个代码编辑器,比如 VS Code 或 Sublime Text。接下来,我们需要创建三个文件:index.html、styles.css 和 scr…...
遗传算法【Genetic Algorithm(GA)】求解函数最大值(MATLAB and Python实现)
一、遗传算法基础知识 来自B站视频的笔记: 【超容易理解】手把手逐句带你解读并实现遗传算法的MATLAB编程(结合理论基础)_哔哩哔哩_bilibili 1、遗传算法 使用“适者生存”的原则,在遗传算法的每一代中,…...
HTB:Administrator[WriteUP]
目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…...
正则表达式中常见的贪婪词
1. * 含义:匹配前面的元素零次或者多次。示例:对于正则表达式 a*,在字符串 "aaaa" 中,它会匹配整个 "aaaa",因为它会尽可能多地匹配 a 字符。代码示例(Python):…...
高阶C语言|深入理解字符串函数和内存函数
文章目录 前言1.求字符串长度1.1 字符串长度函数:strlen模拟实现 2.长度不受限制的字符串函数2.1 字符串拷贝函数:strcpy模拟实现 2.2 字符串连接函数:strcat模拟实现 2.3 字符串比较函数:strcmp模拟实现 3.长度受限制的字符串函数…...
grpc 和 http 的区别---二进制vsJSON编码
gRPC 和 HTTP 是两种广泛使用的通信协议,各自适用于不同的场景。以下是它们的详细对比与优势分析: 一、核心特性对比 特性gRPCHTTP协议基础基于 HTTP/2基于 HTTP/1.1 或 HTTP/2数据格式默认使用 Protobuf(二进制)通常使用 JSON/…...
基于 RAG 的聊天机器人的追踪、日志和指标:结合 Elastic 的 OpenTelemetry 分发
作者:来自 Elastic Bahubali Shetti 如何使用 Elasticsearch 观察基于 OpenAI RAG 的应用程序。使用 OpenTelemetry 对应用程序进行检测,收集日志、跟踪、指标,并了解 LLM 在 Kubernetes 和 Docker 上使用 OpenTelemetry 的 Elastic 分发的表…...
6.二分算法
二分 二分算法,也称为二分查找或折半查找,是一种在有序数组中查找特定元素的高效算法。以下是 C 中二分算法的相关内容: 算法原理 二分算法的基本思想是将有序数组分成两部分,然后将目标值与中间元素进行比较。如果目标值等于中…...
Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年
Android Studio 1.0 宣发于 2014 年 12 月,而现在时间来到 2025 ,不知不觉间 Android Studio 已经陪伴 Androider 走过十年历程。 Android Studio 10 周年,也代表着了我的职业生涯也超十年,现在回想起来依然觉得「唏嘘」ÿ…...
“LoRA技术中参数初始化策略:为何A参数采用正态分布而B参数初始化为0”
在LoRA(Low-Rank Adaptation)中,参数A和B的初始化策略是经过精心设计的,以确保模型训练的稳定性和有效性。具体来说,参数A通常被初始化为正态分布,而参数B则初始化为0。这样的设计有以下几个优点࿱…...
PyTorch中的movedim、transpose与permute
在PyTorch中,movedim、transpose 和 permute这三个操作都可以用来重新排列张量(tensor)的维度,它们功能相似却又有所不同。 movedim 🔗 torch.movedim 用途:将张量的一个或多个维度移动到新的位置。参数&…...
灰色预测模型
特点: 利用少量、不完全的信息 预测的是指数型的数值 预测的是比较近的数据 灰色生成数列原理: 累加生成: 累减生成:通过累减生成还原成原始数列。 加权相邻生成:(会更接近每月中旬,更推荐…...
Java 16进制 10进制 2进制数 相互的转换
在 Java 中,进行进制之间的转换时,除了功能的正确性外,效率和安全性也很重要。为了确保高效和相对安全的转换,我们通常需要考虑: 性能:使用内置的转换方法,如 Integer.toHexString()、Integer.…...
CPU 100% 出现系统中断 怎么解决
CPU 100% 出现系统中断 怎么解决 电脑开机时会掉帧,切换到桌面时就会卡顿,然后打开任务管理器就会看到系统中断的cpu占用率达到100%,过一段时间再打开还是会有显示100%的占用率,这个问题怎么解决? 文章目录 CPU 100% …...
Python-基于mediapipe,pyautogui,cv2和numpy的电脑手势截屏工具(进阶版)
前言:在我们的日常生活中,手机已经成为我们每天工作,学习,生活的一个不可或缺的部分。众所周知:为了我们的使用方便,手机里面的很多功能非常人性化,既便捷又高效,其中就有手机的截屏方式,它们花样繁多,如三指截屏,手势截屏等。那么怎么在电脑里面也实现这个功能呢?…...
设计转换Apache Hive的HQL语句为Snowflake SQL语句的Python程序方法
首先,根据以下各类HQL语句的基本实例和官方文档记录的这些命令语句各种参数设置,得到各种HQL语句的完整实例,然后在Snowflake的官方文档找到它们对应的Snowflake SQL语句,建立起对应的关系表。在这个过程中要注意HQL语句和Snowfla…...
2025年人工智能技术:Prompt与Agent的发展趋势与机遇
文章目录 一、Prompt与Agent的定义与区别(一)定义(二)区别二、2025年Prompt与Agent的应用场景(一)Prompt的应用场景(二)Agent的应用场景三、2025年Prompt与Agent的适合群体(一)Prompt适合的群体(二)Agent适合的群体四、2025年Prompt与Agent的发展机遇(一)Prompt的…...
[论文总结] 深度学习在农业领域应用论文笔记14
当下,深度学习在农业领域的研究热度持续攀升,相关论文发表量呈现出迅猛增长的态势。但繁荣背后,质量却不尽人意。相当一部分论文内容空洞无物,缺乏能够落地转化的实际价值,“凑数” 的痕迹十分明显。在农业信息化领域的…...