【C++初阶】STL之学习string的用法

目录

  • 前言:
  • 一、认识下string
    • 1.1 什么是string
    • 1.2 为什么要有string
  • 二、string 类的接口使用
    • 2.1 初始化与析构
      • 2.1.1 初始化
      • 2.1.2 析构
    • 2.2 容量操作
      • 2.2.1 长度大小——size和length
      • 2.2.2 空间总大小——capacity
      • 2.2.3 判空——empty
      • 2.2.4 清空——clear
      • 2.2.5 预留空间——reserve
      • 2.2.6 改变有效字符个数、填充多余空间——resize
    • 2.3 遍历访问
      • 2.3.1 下标遍历——operator[]
      • 2.3.2 范围for
      • 2.3.3 迭代器遍历——iterator
    • 2.4 修改操作
      • 2.4.1 尾插字符——push_back
      • 2.4.2 尾插字符串——append
      • 2.4.3 字符串追加字符串——operator+=
      • 2.4.4 赋值——assign
      • 2.4.5 插入——insert
      • 2.4.6 删除——erase
      • 2.4.7 查找——find
      • 2.4.8 替换——replace
      • 2.4.9 返回C格式字符串——c_str
      • 2.4.10 截取字符串——substr
    • 2.5 输入操作
      • 2.5.1 获取一行字符串——getline

前言:

STL是C++的标准模板库,里面包含了许多算法和数据结构,例如我们熟悉的顺序表、链表、栈和队列以及一些常见的算法等等,编程者想使用这些就可以直接从库中调用,不必再自己造轮子了。

下面为STL内容的一张图:
在这里插入图片描述
接下来,我们要学习STL中的string。

一、认识下string

1.1 什么是string

string 是C++的一个类模板,字符串的类模板。要定义一个对象为字符串,就可以用string类型,说明它是一个字符串,相当于字符数组。

int main()
{string s1("hello yss");return 0;
}

1.2 为什么要有string

以前我们用C语言写代码的时候,假如字符串如果要计算它的长度,必须要调用C标准库中的函数才行。但是这些函数与字符串本身是分开的,与C++面向对象的思想不契合,而且很容易出现越界等错误,所以C++提供了string类,类里就有我们想使用的函数来操作字符串,我们只需要调用类的接口(函数)即可,更加简洁。

二、string 类的接口使用

string类有许多接口,这里只介绍一些常见的

2.1 初始化与析构

2.1.1 初始化

1️⃣无参与有参
在这里插入图片描述
在这里插入图片描述

int main()
{string s1();//无参 空字符串string s2("hello yss");//有参cout << s2 << endl;return 0;
}

在这里插入图片描述

注意:括号里字符串也可以是一个字符,但是必须要 " y " 这样写,不能 ’ y ’ 这种写法,否则会报错。

2️⃣字符填充
在这里插入图片描述
前面的参数表示字符串的长度,后面的参数是要填充的字符。

int main()
{string s1(5, 'y');cout << s1 << endl;return 0;
}

在这里插入图片描述

3️⃣拷贝构造
在这里插入图片描述

int main()
{string s1("hello yss");string s2(s1);cout << s2 << endl;return 0;
}

在这里插入图片描述
另一种写法:

int main()
{string s1("hello yss");string s2 = s1;//用已经存在的对象去拷贝构造刚未存在的对象cout << s2 << endl;return 0;
}

在这里插入图片描述

4️⃣拷贝子字符串
在这里插入图片描述
pos是从这位置开始拷贝,len是拷贝的个数

int main()
{string s1("hello yss");string s2(s1, 3, 5);//如果最后一个参数的值大于后面的//长度,那么就直接把从pos位置开始的字符串全部拷贝构造cout << s2 << endl;return 0;
}

一个空格也算一个字符
在这里插入图片描述
我们发现len=npos,说明这是一个半缺省,也就是说最后的参数可以不写。

string s2(s1, 3);

npos表示size_t的最大值,作用是返回一个字符串中不存在的位置,可以判断某个子字符串是否存在。

2.1.2 析构

了解下即可
在这里插入图片描述
作用就是清理。

2.2 容量操作

2.2.1 长度大小——size和length

有两个操作函数,都可以计算字符串的有效长度
在这里插入图片描述
在这里插入图片描述

int main()
{string s1("hello yss");cout << s1.size() << endl;cout << s1.length() << endl;return 0;
}

在这里插入图片描述
一般计算大小使用size更好,因为size表示大小即长度,length表示长度,链表、顺序表有长度的说法,但是后面要学习到的树就没有所谓的长度了,只有大小,所以,为了方便且统一,计算的大小都使用size更好些。

2.2.2 空间总大小——capacity

在这里插入图片描述
给对象预分配好一定大小的空间。如果字符串的有效长度小于预分配的空间,空间大小不变;否则再次分配一定大小的空间

int main()
{string s1("hello yss");cout << s1.size() << endl;cout << s1.capacity() << endl;string s2("hello yssxxxxxxxxxxxxxxxx");cout << s2.size() << endl;cout << s2.capacity() << endl;return 0;
}

在这里插入图片描述

2.2.3 判空——empty

在这里插入图片描述

int main()
{string s1("hello yss");cout << s1.empty() << endl;string s2;cout << s2.empty() << endl;return 0;
}

在这里插入图片描述

2.2.4 清空——clear

在这里插入图片描述
清空的是有效字符,总空间大小不变

int main()
{string s1("hello yss");cout << s1.size() << endl;cout << s1.capacity() << endl;s1.clear();cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}

在这里插入图片描述

2.2.5 预留空间——reserve

在这里插入图片描述
1️⃣参数是缺省值,所以参数可写可不写,不写默认缺省值为0,小于空间大小(capacity()的预留空间大小),空间大小不变,不改变字符串中的内容。

int main()
{string s1("hello yss");cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.reserve();cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}

在这里插入图片描述

2️⃣参数的值大于0,小于有效字符的个数

int main()
{string s1("hello yss");cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.reserve(6);cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}

在这里插入图片描述
小于空间总大小,所以空间总大小不变,不影响字符串的内容。

3️⃣参数的值大于等于有效字符个数,小于空间总大小

int main()
{string s1("hello yss");cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.reserve(12);cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}

在这里插入图片描述
还是因为预留的空间小于空间总大小,所以空间总大小不变,且不影响字符串的内容。

4️⃣参数的值大于空间总大小

int main()
{string s1("hello yss");cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.reserve(20);cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}

在这里插入图片描述
当预留空间大于空间总大小时,就会再分配新的空间大小,字符串的内容还是不受影响。

5️⃣调用两次,第二次参数比第一次小

int main()
{string s1("hello yss");s1.reserve(111);cout << s1.capacity() << endl;s1.reserve(6);cout << s1.capacity() << endl;return 0;
}

在这里插入图片描述
第一次调用预留空间的大小扩容后,第二次比第一次要小,不会改变,说明reserve没有缩容的功能。

总结:
1.当reserve预留的空间小于等于空间总大小时,空间总大小不变;
2.reserve预留空间不影响字符串的内容
3.reserve不能缩容。

reserve预留的空间大于空间总大小就会重新分配新的空间总大小,那么这空间总大小的增长规律是怎样的呢,看一下代码:

int main()
{string s1("hello yss");size_t len = s1.capacity();for (int i = 0; i < 100; i++){s1.push_back('x');while (len != s1.capacity()){len = s1.capacity();cout << len << endl;}}return 0;
}

在这里插入图片描述
大概是以1.5倍的大小增长,不同的编译器可能不同。

2.2.6 改变有效字符个数、填充多余空间——resize

在这里插入图片描述
可支持两种写法,一个参数的表示有效字符个数,两个参数的分别为有效字符个数和要填充的字符。

1.先来一个参数的写法:
1️⃣参数的值小于有效字符个数

int main()
{string s1("hello yss");cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.resize(3);cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}

在这里插入图片描述
有效字符个数改变,字符串的内容也改变,空间总大小不变。

2️⃣参数的值大于有效字符个数、小于空间总大小

int main()
{string s1("hello yss");cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.resize(12);cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}

在这里插入图片描述
有效字符个数改变,字符串内容不变(没有填充字符),空间总大小不变。

3️⃣参数的值大于空间总大小

int main()
{string s1("hello yss");cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.resize(20);cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}

在这里插入图片描述
有效字符个数改变,字符串内容不变(没有填充字符),空间总大小改变。

2.有第二个参数(填充字符)的写法:
1️⃣参数的值小于有效字符个数

int main()
{string s1("hello yss");cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.resize(3, 'a');cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}

在这里插入图片描述
有效字符个数改变,字符串内容受影响,空间总大小不变。

2️⃣参数的值大于有效字符个数、小于空间总大小

int main()
{string s1("hello yss");cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.resize(12, 'a');cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}

在这里插入图片描述
有效字符个数改变,字符串增加的空间填充字符,空间总大小不变。

3️⃣参数的值大于空间总大小

int main()
{string s1("hello yss");cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.resize(20, 'a');cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}

在这里插入图片描述
有效字符个数改变,字符串增加的空间填充字符,空间总大小增加。

总结:
1.resize影响有效字符个数,小于原来有效字符个数时,字符串内容随之改变;
2.当n的值(第一个参数)大于原来的有效字符个数会在后面填充字符;
3.n小于空间总大小,空间总大小不变;否则会扩容。

2.3 遍历访问

2.3.1 下标遍历——operator[]

在这里插入图片描述
有两种写法,一个是operator关键字+运算符,另一个是直接方括号下标。

int main()
{string s1("hello yss");for (size_t i = 0; i < s1.size(); i++){cout << s1.operator[](i) << " ";//cout << s1[i] << " ";}cout << endl;return 0;
}

在这里插入图片描述

2.3.2 范围for

int main()
{string s1("hello yss");for (auto e : s1){cout << e << " ";}cout << endl;return 0;
}

在这里插入图片描述

2.3.3 迭代器遍历——iterator

在这里插入图片描述
它是可以检查容器内的元素并遍历元素的数据类型,写法先看以下代码:

int main()
{string s1("hello yss");string::iterator s = s1.begin();while (s != s1.end()){cout << *s << " ";s++;}cout << endl;return 0;
}

s相当于一个指针,首先得到的是字符串的第一个字符,只要它不等于斜杠0,循环打印出每个字符,等于斜杠0跳出。

那么begin()和end()又是什么呢?
在这里插入图片描述
在这里插入图片描述
begin返回容器的首元素,end返回容器的最后一个元素的下一个地址。
在这里插入图片描述
还有加const的写法,用于函数调用时为了不改变字符串的内容形参加const,对应的迭代器也要加const

void Func(const string& ss)
{string::const_iterator s = ss.begin();while (s != ss.end()){cout << *s << " ";s++;}cout << endl;
}
int main()
{string s1("hello yss");Func(s1);return 0;
}

注意:是const_iterator,中间是下划线,与const iterator是不同的。const_iterator限制的指针指向的内容,所以指针指向的内容不能修改const iterator限制的是指针本身,也就是说地址不能修改。

如果要逆置字符串该怎样操作呢
1️⃣先用以前的方法:

int main()
{string s1("hello yss");string::iterator s = s1.begin();while (s != s1.end()){cout << *s << " ";s++;}cout << endl;size_t begin = 0;size_t end = s1.size() - 1;while (begin < end){char tmp = s1[begin];s1[begin] = s1[end];s1[end] = tmp;begin++;end--;}s = s1.begin();while (s != s1.end()){cout << *s << " ";s++;}return 0;
}

在这里插入图片描述
这里交换两个元素时要自己写,感觉有点麻烦,可以使用模板

2️⃣交换模板:

template<class T>
void Swap(T& a, T& b)
{T t = a;a = b;b = t;
}
int main()
{string s1("hello yss");string::iterator s = s1.begin();while (s != s1.end()){cout << *s << " ";s++;}cout << endl;size_t begin = 0;size_t end = s1.size() - 1;while (begin < end){Swap(s1[begin], s1[end]);begin++;end--;}s = s1.begin();while (s != s1.end()){cout << *s << " ";s++;}return 0;
}

不看顶上的交换模板函数,循环里的代码比前面简洁了一些,但是还是感觉挺繁琐的

3️⃣逆置算法函数:
在这里插入图片描述

int main()
{string s1("hello yss");string::iterator s = s1.begin();while (s != s1.end()){cout << *s << " ";s++;}cout << endl;reverse(s1.begin(), s1.end());s = s1.begin();while (s != s1.end()){cout << *s << " ";s++;}return 0;
}

在这里插入图片描述

不用逆置算法函数,也可以逆序遍历
在这里插入图片描述
在这里插入图片描述

int main()
{string s1("hello yss");string::reverse_iterator s = s1.rbegin();while (s != s1.rend()){cout << *s << " ";s++;}cout << endl;return 0;
}

在这里插入图片描述
这两个接口的也有const,与前面的同理

void Func(const string& ss)
{string::const_reverse_iterator s = ss.rbegin();///while (s != ss.rend()){cout << *s << " ";s++;}cout << endl;
}
int main()
{string s1("hello yss");Func(s1);return 0;
}

有没有发现其中一段代码太长了,所以这里就就可以用以前学过的auto来简化代码

auto s = ss.rbegin();//自动推导类型

2.4 修改操作

2.4.1 尾插字符——push_back

在这里插入图片描述

int main()
{string s1("hello yss");s1.push_back('x');cout << s1 << endl;return 0;
}

在这里插入图片描述

2.4.2 尾插字符串——append

这个接口的可实现方式比较多,所以这里只介绍常见的
在这里插入图片描述

int main()
{string s1("hello yss");s1.append("a");cout << s1 << endl;s1.append("vvvv");cout << s1 << endl;return 0;
}

在这里插入图片描述
因为是字符串,所以要双引号,但是双引号里也可以是一个字符。

2.4.3 字符串追加字符串——operator+=

在这里插入图片描述
这个比前面两个都要实用得多了,既可以尾插字符串,也可以尾插字符。而且写起来也方便。

int main()
{string s1("hello yss");s1 += "vvvv";cout << s1 << endl;string s2("hello yss");s2 += 'd';cout << s2 << endl;string s3("hello yss");s3 += s1;cout << s3 << endl;return 0;
}

在这里插入图片描述

2.4.4 赋值——assign

在这里插入图片描述
1️⃣用一个字符串赋给另一个字符串

int main()
{string s1("hello yss");string s2 = s1.assign(s1);cout << s2 << endl;return 0;
}

在这里插入图片描述

2️⃣从一个字符串中提取子字符串赋给另一个字符串

int main()
{string s1("hello yss");string s2;s2.assign(s1,2,5);cout << s2 << endl;return 0;
}

在这里插入图片描述

3️⃣一个字符串赋给另一个字符串

int main()
{string s2;s2.assign("yyyyyyyy");cout << s2 << endl;return 0;
}

在这里插入图片描述

4️⃣一个字符串赋给另一个字符串,限定个数

int main()
{string s2;s2.assign("yyyyyyyy", 3);cout << s2 << endl;return 0;
}

在这里插入图片描述

5️⃣字符赋给一个字符串,有个数控制

int main()
{string s3;s3.assign(10, 'x');cout << s3 << endl;return 0;
}

在这里插入图片描述

2.4.5 插入——insert

1️⃣
在这里插入图片描述
从pos位置插入一个字符串,和可以限制插入字符串的个数。

int main()
{string s1("hello yss");s1.insert(1, "ccc");cout << s1 << endl;string s2("hello yss");s2.insert(3, "cccccc",3);cout << s2 << endl;return 0;
}

在这里插入图片描述
2️⃣
在这里插入图片描述
从pos位置插入一个字符串。第二个有点长,在第一个的基础上可以选择要插入的字符串的起始的位置,并且限制插入的个数。

int main()
{string s3("hello yss");string s4("hello world");s4.insert(5, s3);cout << s4 << endl;string s5("hello yss");string s6("hello world");s6.insert(5, s5,2, 3);cout << s6 << endl;return 0;
}

在这里插入图片描述
3️⃣
在这里插入图片描述
插入字符,可以控制个数

int main()
{string s7("hello yss");s7.insert(5, 4, 'x');cout << s7 << endl;return 0;
}

在这里插入图片描述

2.4.6 删除——erase

在这里插入图片描述
1️⃣从pos位置开始删除len个字符,这两个参数都是缺省值,如果不写参数,就是一个字符串全部删除;
2️⃣删除某个位置的字符;
3️⃣删除从一个位置到另一个位置的字符串。

int main()
{string s1("hello yss");s1.erase();cout << s1 << endl;string s2("hello yss");s2.erase(3,5);cout << s2 << endl;string s3("hello yss");s3.erase(s3.begin());cout << s3 << endl;string s4("hello yss");s4.erase(s4.begin() + 1, s4.end() - 1);cout << s4 << endl;return 0;
}

在这里插入图片描述

2.4.7 查找——find

在这里插入图片描述
查找有一个字符串或者字符,后面没有参数就默认从字符串的起始位置开始找,有写参数从pos位置开始找

int main()
{string s1("hello yss");size_t pos = s1.find(" ");cout << pos << endl;return 0;
}

在这里插入图片描述

2.4.8 替换——replace

在这里插入图片描述
用len个90#替换pos位置的字符

int main()
{string s1("hello yss");s1.replace(5, 1, "90#");cout << s1 << endl;return 0;
}

在这里插入图片描述

小练习:把一个字符串内的所有空格替换成20%
1️⃣做法1:

int main()
{string s1("hello yss hello world");size_t pos = s1.find(" ");while (pos != string::npos){s1.replace(pos, 1, "20%");pos = s1.find(" ", pos + 3);}cout << s1 << endl;return 0;
}

在这里插入图片描述

假如一个字符串内有多个空格,先用pos记录第一个空格的位置,当pos不等于npos成立,说明在字符串中找到了这个pos位置,然后在这个位置替换成20%。因为前面的pos已经用过一次了,所以这里要重新定义新的pos位置找后面的空格。参数为pos+3是因为20%有3个字符,所以要跳过这3个字符开始查找。直到后面没有空格,找不到,返回整型的最大值,为-1,然后跳出循环。

find()接口的一个说明:找不到返回npos
在这里插入图片描述

这里再介绍下npos:
在这里插入图片描述
它是静态成员常量,值为-1,是无符号类型的,所以也是整型的最大值。

2️⃣做法2:

int main()
{string s1("hello yss hello world");string s2;for (auto e : s1){if (e == ' '){s2 += "20%";}else{s2 += e;}}s1.swap(s2);//交换cout << s1 << endl;return 0;
}

在这里插入图片描述
创建一个临时字符串,遍历原来的字符串,如果是空格,在临时的字符串+=空格,否则+=原来字符串中的字符。如果不想用临时字符串打印出来,可以交换。

2.4.9 返回C格式字符串——c_str

在这里插入图片描述
可以将 const string* 类型 转化为 const char* 类型,因为在c语言中没有string,所以要把它转变成C语言中字符串的形式。

在文件操作中C语言和C++混着用:

int main()
{string filename("test.cpp");FILE* pf = fopen(filename.c_str(), "r");char ch = fgetc(pf);while (ch != EOF){cout << ch;ch = fgetc(pf);}return 0;
}

在这里插入图片描述

2.4.10 截取字符串——substr

在这里插入图片描述
因为两个参数都有缺省值,两个都不写,就相当于直接取整个字符串了;后面的参数不写,从pos位置开始截取剩下的全部字符串。

1️⃣截取 . 和它后面的字符串

int main()
{string s1("test.cpp");size_t pos = s1.find('.');if (pos != string::npos){string s2 = s1.substr(pos);cout << s2 << endl;}return 0;
}

在这里插入图片描述

2️⃣如果一个字符串内有多个点,要截取最后一个点以及后面的字符串

int main()
{string s1("test.cpp.xxx");size_t pos = s1.rfind('.');if (pos != string::npos){string s2 = s1.substr(pos);cout << s2 << endl;}return 0;
}

在这里插入图片描述
用原来的find()要从头开始找,比较麻烦。所以string还提供了另一个查找的函数——rfind(),可以逆向查找,即从后向前。

3️⃣分割网址

int main()
{string s("https://cplusplus.com/reference/string/string/substr/");string s1, s2, s3;size_t pos1 = s.find(':');if (pos1 != string::npos){s1 = s.substr(0, pos1);cout << s1 << endl;}size_t pos2 = s.find('/', pos1 + 3);if (pos2 != string::npos){s2 = s.substr(pos1 + 3, pos2 - pos1 - 3);cout << s2 << endl;}s3 = s.substr(pos2 + 1);cout << s3 << endl;return 0;
}

在这里插入图片描述

网址的格式:
<协议>://<服务器名称>.<域名>/<目录>/<文件名>

我们是想分割成3个部分,所以定义3个string 对象,一个一个分割。首先分割出协议,先要找到冒号的位置,冒号的位置的pos1的值即为前面字符串的有效个数,所以截取字符串从起始位置开始截取pos1个。第二个分割出服务器名称和域名,要找的截至位置是 / ,但是要注意从pos1+3的位置开始找,找到后也是从pos1+3的位置开始截取,截取pos2 - pos1 - 3个。最后一个不必多说。

2.5 输入操作

2.5.1 获取一行字符串——getline

在这里插入图片描述
istream& is表示一个输入流,例如cin;char delim表示终止符,例如回车,或者别的符号。

1️⃣自己定义终止符

int main()
{string s1;getline(cin, s1,'#');cout << s1 << endl;return 0;
}

在这里插入图片描述

2️⃣自己没有定义终止符

int main()
{string s1;getline(cin, s1);cout << s1 << endl;return 0;
}

在这里插入图片描述
自己没有写终止符,默认的终止符为回车

那么这个有什么用呢?在输入一行字符串的时候,如果我们使用的是cin,它的默认终止符为空格或者换行,所以如果我们输入的字符串中有空格,打印出来的结果就不会是一行。

看以下代码:

int main()
{string s1;cin >> s1;cout << s1 << endl;return 0;
}

在这里插入图片描述
所以如果在做题中还是在其他写代码的场景要求输出一整行字符串,getline就是一个好的选择。

在这里插入图片描述

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

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

相关文章

学习视频剪辑方法:AI智剪助力,批量处理短视频无忧

随着短视频的兴起&#xff0c;越来越多的人开始关注如何有效地制作和发布这些内容。但是&#xff0c;短视频的制作并不容易&#xff0c;要耗费大量的时间和精力。现在有很多AI智能剪辑工具可以快速、高效地制作短视频。其中&#xff0c;AI智剪是一款非常受欢迎的视频剪辑功能&a…

原生javascript实现放大镜效果

效果图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>放大镜</title><style&g…

图论|知识图谱——详解自下而上构建知识图谱全过程

导读&#xff1a;知识图谱的构建技术主要有自顶向下和自底向上两种。其中自顶向下构建是指借助百科类网站等结构化数据源&#xff0c;从高质量数据中提取本体和模式信息&#xff0c;加入到知识库里。而自底向上构建&#xff0c;则是借助一定的技术手段&#xff0c;从公开采集的…

【Python】Playwright模块进行自动化测试

playwright是由微软开发的Web UI自动化测试工具&#xff0c;支持Node.js、Python、C# 和 Java语言&#xff0c;本文将介绍Python版本的Playwright使用方法。 微软开源了一个非常强大的自动化项目叫playwright-python&#xff0c;项目地址&#xff1a;https://github.com/micros…

[图片来源BZhan]最小生成树(Prim➕Kruskal)、最短路径(Dijkstra➕Floyd)

文章目录 0.基础知识0.1图的存储结构0.2算法复杂度1.BFS和DFS2.Prim和Kruskal 1.最小生成树1.1Prim算法1.算法思想2.Prim代码实现 1.2Kruskal算法1.算法思想2.Kruskal代码实现[demo] 2.最短路径2.1问题抽象:2.2两种常见的最短路径问题:1.Dijkstra: 单源最短路径O(N^2)2.Floyd: …

⑥【bitmap 】Redis数据类型: bitmap [使用手册]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Redis bitmap ⑥Redis bitmap 基本操作命令1. …

记录一些免费的 API接口

主要记录一些日常开发中可以使用到的一些免费api接口&#xff0c;目前包括 ip地址查询、天气查询 通过 IP 查询地址 ip-api (不支持 https) &#x1f4a1; api接口文档 &#x1f579; 调用接口 $ curl http://ip-api.com/json&#x1f4dd; 返回信息&#xff08;位置信息&…

easyx的基本使用<一>(万字解析)

easyx的基本使用 一.基本框架1.创建文件2.创建窗体-initgraph,closegraph,getchar 二.简单的绘制1.圆形-circle2.坐标系统-setorigin,setaspectratio 三.简单图形1.绘制点-putpixel2.简单的直线-line3.矩形-rectangle4.椭圆-ellipse5.圆角矩形-roundrect6.扇形-pie7.圆弧-arc 四…

ElasticSearch01

ElasticSearch 版本&#xff1a;7.8 学习视频&#xff1a;尚硅谷 笔记&#xff1a;https://zgtsky.top/ ElasticSearch介绍 Elaticsearch&#xff0c;简称为es&#xff0c; es是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b…

JMeter 测试脚本编写技巧

JMeter 是一款开源软件&#xff0c;用于进行负载测试、性能测试及功能测试。测试人员可以使用 JMeter 编写测试脚本&#xff0c;模拟多种不同的负载情况&#xff0c;从而评估系统的性能和稳定性。以下是编写 JMeter 测试脚本的步骤。 第 1 步&#xff1a;创建测试计划 在JMet…

JVM——垃圾回收(方法区中的垃圾回收和(堆回收)自动垃圾回收)

目录 1.自动垃圾回收介绍1.C/C的内存管理2.Java的内存管理3.垃圾回收的对比 2.方法区的回收方法区的回收 – 手动触发回收 3.堆回收1.引用计数法2.可达性分析算法 1.自动垃圾回收介绍 1.C/C的内存管理 ⚫ 在C/C这类没有自动垃圾回收机制的语言中&#xff0c;一个对象如果不再…

C语言—什么是数组名

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int arr[]{1,2,3,4};printf("%p\n",arr);printf("%p\n",&arr);printf("%p\n",*arr);return 0; } 结论&#xff1a;数组名是数组首元素地址&#xff08;下标为0的元素…

Vatee万腾独特科技力量的前沿探索:Vatee的数字化奇点

在当今科技的浪潮中&#xff0c;Vatee万腾以其独特的科技力量成为前沿探索的引领者&#xff0c;正迎来数字化奇点的新时代。Vatee万腾不仅仅是一家科技公司&#xff0c;更是一支探索未知领域、开创数字时代新局面的先锋力量。 Vatee万腾的数字化奇点体现在其对前沿技术的深刻理…

MFC设置单选按钮点击自己可以可选和不可选

mfc是c的一个框架&#xff0c;可谓是经久不衰。最近博主遇到一个问题&#xff0c;就是单选按钮点击自己可以设置可选和不可选&#xff0c;貌似类似复选框一样&#xff0c;但领导分发的任务上要求的是用单选按钮实现复选框这种类似功能&#xff0c;实现效果类似如下图&#xff1…

【Java】认识异常

文章目录 一、异常的概念和体系结构1.异常的概念2.异常的体系结构3.异常的分类 二、异常的处理1.防御式异常2.异常的抛出3.异常的捕捉 三、异常的处理流程四、自定义异常类 一、异常的概念和体系结构 1.异常的概念 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为…

Redis实战篇(一)短信登录

Redis实战篇&#xff08;一&#xff09;短信登录 1.1、导入黑马点评项目 1.1.1 、导入SQL 1.1.2、有关当前模型 手机或者app端发起请求&#xff0c;请求我们的nginx服务器&#xff0c;nginx基于七层模型走的事HTTP协议&#xff0c;可以实现基于Lua直接绕开tomcat访问redis&a…

截图转HTML代码,支持预览,前端不用浪费时间写html和css了

截图转代码 试用地址&#xff1a;https://picoapps.xyz/free-tools/screenshot-to-code 这个简单的应用可以将截图转换为HTML/Tailwind CSS代码。它使用GPT-4 Vision来生成代码&#xff0c;并使用DALL-E 3来生成类似的图像。现在你也可以输入一个URL来克隆一个现有的网站&#…

RuntimeError: CUDA error: device-side assert triggered

背景&#xff1a; 使用SAGEConv卷积层的图神经网络&#xff0c;网络架构如下 原因&#xff1a; 我在卷积层之前改变了特征矩阵的维度&#xff0c;原本为[172,1,32] 现在改为了 [172,2,32]。导致了特征矩阵x在进行 “x x.squeeze(1)” 操作时并没有将第二向量值去除&#xff08…

蓝桥杯每日一题2023.11.25

题目描述 “蓝桥杯”练习系统 (lanqiao.cn) 题目分析 对于此题目最开始是递归想法&#xff0c;但发现题意中的匹配次数实际上是指在这8个字母中这8个字母每个字母对应的个数是否相同&#xff0c;如果相同则匹配。 此处我们可以使用subsrtr函数&#xff0c;每次循环截取8个字…

印刷基板开孔机上的直线导轨怎么安装?

直线导轨是属于高精度的传动元件&#xff0c;作为印刷基板开孔机重要的传动元件&#xff0c;倘若安装不当&#xff0c;严重则无法正常作业&#xff0c;轻则影响直线导轨的精度和寿命。那么&#xff0c;印刷基板开孔机的直线导轨是如何安装的呢&#xff1f; 在安装前&#xff0c…