C++面向对象程序设计-北京大学-郭炜【课程笔记(十一)】

C++面向对象程序设计-北京大学-郭炜【课程笔记(十一)】

  • 1、string(重要知识点)
    • 1.2、string的赋值和链接
    • 1.3、比较string
    • 1.4、子串
    • 1.5、交换string
    • 1.6、寻找string中的字符
    • 1.7、删除string中的字符
    • 1.8、替换string中的字符
    • 1.9、在string中插入字符(重要)
    • 1.10、转换成C语言式char * 字符串
    • 1.11、字符串流处理
    • 1.12、字符串流处理-字符串输出流istringstream
  • 2、标准模板库STL
    • 1.1、STL的基本概念
    • 1.2、容器概述
    • 2.3、顺序容器
  • 3、迭代器
    • 2.1、迭代器的定义与使用
    • 2.2、双向迭代器
    • 2.3、随机访问迭代器
  • 4、算法简介
    • find()函数原型
    • 参数
    • 返回值
    • 使用方法
    • 示例
      • 示例1:在 `vector` 中查找元素
      • 示例2:在 `list` 中查找元素
      • 示例3:在数组中查找元素
      • 注意事项
      • 小结
  • 5、STL中“大” “小”的概念
    • 5.1、重要说明

做毕业答辩变PPT脱了几天,终于要结束读书生涯了,哈哈。
开始课程:P40 1_1. string类
课程链接:程序设计与算法(三)C++面向对象程序设计 北京大学 郭炜
课程PPT:github提供的对应课程PPT

1、string(重要知识点)

学了string类就可以不用char*类当字符串用了。

string类:

  • string类是模板类
    • typedef basic_string<char> string;
  • 使用string类要包含头文件#include<string>
  • string对象的初始化:
    • string s1(“Hello”);
    • string month = “March”;
    • string s2(8, ‘x’); // 8个x

注意事项:错误的初始化方式:

  • string error1 = 'c'; // 错(直接用一个字符初始化一个string对象是不可以的)
  • 可以将字符赋值给string对象;
    • string s;
    • s = ‘c’; // OK
  • string error2(‘u’); // 错
  • string error3 = 22; // 错
  • string error4(8); // 错
#include<iostream>
#include<string>
using namespace std;int main(int argc, char * argv[])
{string s1("hello");cout << s1 << endl;      // hellostring s2(8, 'x');       cout << s2 << endl;      // xxxxxxxxstring month = "March"; cout << month << endl;   // Marchstring s;s = 'n';cout << s << endl;       // nreturn 0;
}
  • string对象的长度用成员函数length()读取;
    • string s(“hello”);
  • cout << s.length() << endl;
  • string支持流读取运算符
    • string stringObject;
    • cin >> stringObject;
  • string支持getline函数
    • string s;
    • getline(cin, s);
  • 用 = 赋值
    • string s1(“cat”), s3;
    • s2 = s1;
  • 用assign长远函数赋值
    • string s1(“cat”), s3;
    • s3.assign(s1);
  • 用assign成员函数部分复制
    • string s1(“catpig”), s3;
    • s3.assign(s1, 1, 3);
    • // 从s1中下标为1的字符开始复制3个字
  • 耽搁字符复制
    • s2[5] = s1[3] = ‘a’;
  • 逐个访问string对象中的字符
    • string s1(“Hello”);
    • for(int i=0; i<s1.length(); i++)
    • {cout << s1.at(i) << endl;}
  • 成员函数at会做范围检查,如果超出范围,会抛出out_of_renge异常,而下标运算符[]不做范围检查。

1.2、string的赋值和链接

  • 用+运算符连接字符串
    • string s1(“good”), s2(“morning!”);
    • s1 += s;
    • cout << s1;
  • 用成员函数append连接字符串
    • string s1(“good”), s2(“morning!”);
    • s1.append(s2);
    • cout << s1;
    • s2.append(s1, 3, s1.size()); //s1.size(), s1字符数
    • cout << s2;
    • // 下标为3开始,s1.size()个字符,如果字符穿内没有足够字符,则复制到字符串最后一个字符

1.3、比较string

  • 用关系运算符比较string的大小
    • 返回值都是bool类型,成立返回true,否则返回false
    • 例如:
#include<iostream>
#include<string>
using namespace std;int main(int argc, char * argv[])
{string s1("hello"), s2("hello"), s3("hello");bool b = (s1 == s2);cout << b << endl;b = (s1 == s3);cout << b << endl;b = (s1 > s3);cout << b << endl;return 0;
}
// OUT
1
1
0
  • 用成员函数compare比较string的大小
    例题1:
#include <iostream>
#include <string>
#include <cctype>
using std::cout;
using std::endl;
using std::cin;
using std::string;
int main(void){string str1="hi,test,hello";string str2="hi,test";//字符串比较if(str1.compare(str2)>0)printf("str1>str2\n");else if(str1.compare(str2)<0)printf("str1<str2\n");elseprintf("str1==str2\n");//str1的子串(从索引3开始,包含4个字符)与str2进行比较if(str1.compare(3,4,str2)==0)printf("str1的指定子串等于str2\n");elseprintf("str1的指定子串不等于str2\n");//str1指定子串与str2的指定子串进行比较if(str1.compare(3,4,str2,3,4)==0)printf("str1的指定子串等于str2的指定子串\n");elseprintf("str1的指定子串不等于str2的指定子串\n");//str1指定子串与字符串的前n个字符进行比较if(str1.compare(0,2,"hi,hello",2)==0)printf("str1的指定子串等于指定字符串的前2个字符组成的子串\n");elseprintf("str1的指定子串不等于指定字符串的前2个字符组成的子串\n");return 0;
}
// OUT:
str1>str2
str1的指定子串不等于str2
str1的指定子串等于str2的指定子串
str1的指定子串等于指定字符串的前2个字符组成的子串

例题2:

#include<iostream>
#include<string>
using namespace std;int main(int argc, char * argv[])
{string s1("hello"), s2("hello"), s3("hell");int f1 = s1.compare(s2);   // 0  // hello == helloint f2 = s1.compare(s3);   // 1  // hello > hellint f3 = s3.compare(s1);   // -1 // hell < helloint f4 = s1.compare(1, 2, s3);    // -3 int f5 = s1.compare(0, s1.size(), s3);  // 1cout << f1 << endl << f2 << endl << f3 << endl;cout << f4 << endl << f5 << endl;return 0;
}

注意事项:C++中int f4 = s1.compare(1, 2, s3);结果显示为-3,为什么

在 C++ 的 std::string 类中,compare 函数的第一个参数是起始位置,第二个参数是要比较的长度,第三个参数是要比较的字符串。当调用 s1.compare(1, 2, s3) 时,表示从 s1 的索引位置 1 开始,比较长度为 2 的子字符串与 s3 的内容。如果 s1 的子字符串小于 s3,则返回值为负数,且返回值的绝对值表示两个字符串第一个不相等字符的 ASCII 码差值的相反数。因此,结果为 -3 表示在比较的过程中,第一个不相等字符在 ASCII 码上 s1 的子字符串要小于 s3

1.4、子串

  • 成员函数substr
string s1("hello world"), s2;
s2 = s1.substr(4,5);  // 下标4开始5个字符
cout << s2 << endl;  // 输出:o wor

1.5、交换string

  • 成员函数swap
string s1("hello world"), s2("really");
s1.swap(s2);
cout << s1 << endl;  // really
cout << s2 << endl;  // hello world

1.6、寻找string中的字符

  • 成员函数find()
    • string s1(‘hello world’);
    • s1.find(“lo”);
    • 在s1中从前向后查找“lo“第一次出现的地方,如果找到,返回”lo“开始的位置,即I所在的位置下标。如果找不到,返回string::npos(string 中定义的京塔常量)。
      请添加图片描述
      在这里插入图片描述请添加图片描述
      请添加图片描述

请添加图片描述

1.7、删除string中的字符

  • 成员函数erase()
    • string s1(“hello world”);
    • s1.erase(5);
    • cout << s1; // hello
    • cout << s1.length(); // 5
    • cout << s1.size(); // 5
      // 去掉下标5及之后的字符
      // 输出:hello55

1.8、替换string中的字符

  • 成员函数replace()
    • string s1(“hello world”);
    • s1.replace(2,3, “haha”);
    • cout << s1; // hehaha world
    • // 将s1中下标2开始的3个字符换成“haha”

1.9、在string中插入字符(重要)

请添加图片描述

1.10、转换成C语言式char * 字符串

  • 在C++中,c_str()函数用于返回一个指向以空字符结尾的数组的指针,该数组包含了作为 std::string 对象内容的字符序列的副本。这个函数通常用于将 std::string 对象转换为 C 风格的字符串(以空字符结尾的字符数组),以便与需要使用 C 风格字符串的函数进行交互。注意,返回的指针指向的字符数组是 const char* 类型的,因此不能直接修改该数组的内容。
    请添加图片描述
  • 在C++中,data()函数用于返回一个指向 std::string 对象中存储的字符数据的指针。与c_str()函数不同,data()函数不会在字符串的末尾添加空字符(‘\0’),因此返回的指针可以用于修改字符串的内容。需要注意的是,在修改返回的指针所指向的字符串时,要确保不会超出字符串的长度,否则会导致未定义的行为。
    请添加图片描述

1.11、字符串流处理

请添加图片描述

#include<string>
#include<iostream>
#include<sstream>
using namespace std;int main()
{string input("Input test 123 4.7 A");istringstream inputString(input);string string1, string2;int i;double d;char c;inputString >> string1 >> string2 >> i >> d >> c;cout << string1 << endl << string2 << endl;cout << i << endl << d << endl << c << endl;long L;if(inputString >> L){cout << "long\n";}else cout << "empty\n";
}
// OUT
Input
test
123
4.7
A
empty

这段代码使用了C++的字符串流类istringstream来解析一个字符串input。下面是对代码的逐行解释:

  1. #include<string>:包含了C++标准库中的string头文件,提供了字符串操作的功能。
  2. #include<iostream>:包含了C++标准输入输出流的头文件,提供了输入输出功能。
  3. #include<sstream>:包含了C++标准库中的字符串流头文件,提供了字符串流的功能。
  4. using namespace std;:使用了命名空间std,这样就可以直接使用标准库中的类和函数,而不需要加上std::前缀。
  5. string input("Input test 123 4.7 A");:定义了一个字符串input,内容为"Input test 123 4.7 A"
  6. istringstream inputString(input);:定义了一个字符串流inputString,并将input作为初始化参数。
  7. string string1, string2;:定义了两个字符串变量string1string2
  8. int i;:定义了一个整型变量i
  9. double d;:定义了一个双精度浮点型变量d
  10. char c;:定义了一个字符型变量c
  11. inputString >> string1 >> string2 >> i >> d >> c;:使用字符串流inputString依次读取字符串、字符串、整型、双精度浮点型和字符,分别赋值给string1string2idc
  12. cout << string1 << endl << string2 << endl;:输出变量string1string2的值,并换行。
  13. cout << i << endl << d << endl << c << endl;:输出变量idc的值,并换行。
  14. long L;:定义了一个长整型变量L
  15. if(inputString >> L):尝试从字符串流inputString中读取一个长整型值到变量L中,如果成功读取则执行下面的代码块,否则执行else中的代码块。
  16. { cout << "long\n"; }:如果成功读取了长整型值,则输出"long"并换行。
  17. else cout << "empty\n";:如果未能成功读取长整型值,则输出"empty"并换行。

这段代码的功能是将字符串input中的各个部分分别解析为不同类型的变量,并输出它们的值。

1.12、字符串流处理-字符串输出流istringstream

#include<string>
#include<iostream>
#include<sstream>
using namespace std;int main()
{ostringstream outputString;int a = 10;outputString << "This" << a << "ok" << endl;cout << outputString.str();  //This10okreturn 0;
}
// OUT
This10ok

这段代码演示了如何使用 ostringstream 类来构建一个字符串流,并将各种类型的数据写入其中,最后将其作为一个字符串输出到标准输出流中。

  1. ostringstream outputString;:创建一个 ostringstream 对象 outputString,用于构建一个字符串流。

  2. outputString << "This" << a << "ok" << endl;:使用 << 操作符将字符串 "This"、整数 a 和字符串 "ok" 以及换行符 endl 依次写入到 outputString 中。

  3. cout << outputString.str();:使用 str() 方法获取 outputString 中的字符串内容,并将其输出到标准输出流 cout 中。

  4. return 0;:返回主函数的结束。

2、标准模板库STL

请添加图片描述请添加图片描述

1.1、STL的基本概念

请添加图片描述在这里插入图片描述

1.2、容器概述

在这里插入图片描述
在这里插入图片描述

2.3、顺序容器

在这里插入图片描述
请添加图片描述在这里插入图片描述
请添加图片描述请添加图片描述
请添加图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

3、迭代器

2.1、迭代器的定义与使用

定义一个容器类的迭代器的方法可以是:

  • 容器类名::iterator 变量名;
  • 容器类名::const_iterator 变量名;

访问一个迭代器指向的元素:

  • * 迭代器变量名

迭代器上可以执行++操作,以使其指向容器中的下一个元素。如果迭代器到达了容器中的最后一个元素的后面,此时再使用它,则会报错,类似于使用NULL或未初始化的指针一样。
例题:

#include<vector>
#include<iostream>
using namespace std;int main()
{vector<int> v;  // 一个存放int元素的数组,一开始里面没有元素v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4);vector<int>::const_iterator i;  // 常用迭代器for(i = v.begin(); i != v.end(); i++){cout << *i << ",";   // 1,2,3,4,}cout << endl;vector<int>::reverse_iterator r;  // 反向迭代器for(r = v.rbegin(); r!=v.rend(); r++){cout << *r << ",";  // 4,3,2,1,}cout << endl;vector<int>::iterator j; // 非常量迭代器for(j=v.begin(); j != v.end(); j++)*j = 100;  // 容器中数组每个元素赋值100for(i=v.begin(); i != v.end(); i++)cout << *i << ",";   // 100,100,100,100
}
// OUT
STL % ./1
1,2,3,4,
4,3,2,1,
100,100,100,100

2.2、双向迭代器

在这里插入图片描述

2.3、随机访问迭代器

在这里插入图片描述

p<p1的含义:p指向的这个元素他在p1所指向这个元素的前面。

vector的迭代器是随机迭代器,遍历vector可以有以下几种做法(deque亦然):
#include<vector>
#include<iostream>
using namespace std;int main()
{vector<int> v(5); // 创建一个包含100个元素的整数向量,默认初始化为0int i;for(i=0;i<v.size();i++) // 使用下标遍历vectorcout << v[i];  // 根据下标随机访问,并输出每个元素cout << ";" << endl;// 定义一个常量迭代器ii,通过for循环遍历向量v,并输出每个元素。vector<int>::const_iterator ii; for(ii=v.begin(); ii != v.end(); ii++) // 使用常量迭代器遍历vectorcout << *ii;  // 输出迭代器指向的元素cout << ";" << endl;for(ii = v.begin(); ii < v.end(); ii++) // 使用常量迭代器遍历vector(条件使用<)cout << *ii;  // 输出迭代器指向的元素cout << ";" << endl;// 间隔一个元素输出ii= v.begin();while(ii < v.end()) // 迭代器方式间隔输出{cout << *ii;  // 输出当前迭代器指向的元素ii = ii + 2;  // 将迭代器向前移动两个位置}return 0;
}
// OUT
00000;
00000;
00000;
0
0
0
list的迭代器是双向迭代器,正确遍历list的方法如下:

请添加图片描述

4、算法简介

在这里插入图片描述
在这里插入图片描述
C++ 中的 find() 函数用于在容器(如数组、vectorlist 等)中查找特定元素。它是 <algorithm> 头文件中的一个标准算法。下面是 find() 函数的详细介绍,包括其使用方法和例子。

find()函数原型

find() 函数有多个重载版本,最常用的版本如下:

template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const T& value );

参数

  • first:指向输入范围的起始位置的迭代器。
  • last:指向输入范围的结束位置的迭代器(不包含在范围内)。
  • value:要查找的元素的值。

返回值

  • 如果找到匹配的元素,返回指向该元素的迭代器。
  • 如果没有找到匹配的元素,返回 last

使用方法

find() 函数遍历从 firstlast 范围内的元素,比较每个元素与 value 是否相等。如果找到相等的元素,则返回一个指向该元素的迭代器;否则,返回一个指向 last 的迭代器。

示例

以下是 find() 函数的几个使用示例。

示例1:在 vector 中查找元素

#include <iostream>
#include <vector>
#include <algorithm> // 包含 find() 函数的头文件int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 查找元素3auto it = std::find(vec.begin(), vec.end(), 3);// std::distance(vec.begin(), it) 是 C++ 标准库中的一个实用函数,用于计算两个迭代器之间的距离(即元素的数量)。if (it != vec.end()) {std::cout << "Found element 3 at position: " << std::distance(vec.begin(), it) << std::endl;} else {std::cout << "Element 3 not found." << std::endl;}return 0;
}

输出:

Found element 3 at position: 2

示例2:在 list 中查找元素

#include <iostream>
#include <list>
#include <algorithm> // 包含 find() 函数的头文件int main() {std::list<int> lst = {10, 20, 30, 40, 50};// 查找元素30auto it = std::find(lst.begin(), lst.end(), 30);if (it != lst.end()) {std::cout << "Found element 30." << std::endl;} else {std::cout << "Element 30 not found." << std::endl;}return 0;
}

输出:

Found element 30.

示例3:在数组中查找元素

#include <iostream>
#include <algorithm> // 包含 find() 函数的头文件int main() {int arr[] = {5, 10, 15, 20, 25};// 查找元素20auto it = std::find(std::begin(arr), std::end(arr), 20);if (it != std::end(arr)) {std::cout << "Found element 20 at position: " << (it - std::begin(arr)) << std::endl;} else {std::cout << "Element 20 not found." << std::endl;}return 0;
}

输出:

Found element 20 at position: 3
#include<vector>
#include<algorithm>
#include<iostream>using namespace std;int main()
{// find 算法示例int array[10] = {10,20,30,40};vector<int>v;v.push_back(1); v.push_back(2);v.push_back(3); v.push_back(4);vector<int>::iterator p;p = find(v.begin(), v.end(), 3);if(p != v.end()){cout << *p << endl;  // 输出3}p = find(v.begin(), v.end(), 9);if(p==v.end())cout << "not found " << endl;p = find(v.begin()+1, v.end()-2, 1); // 整个容器:[1,2,3,4],查找区间:[2,3)if(p != v.end())cout << *p << endl;int *pp = find(array, array+4, 20);  // 数组名是迭代器cout << * pp << endl;
}
输出:
3
not found 
3
20

注意事项

  • find() 函数使用的是元素的相等比较运算符 ==,因此要查找的元素类型必须支持该运算符。
  • find() 函数只能用于支持输入迭代器的范围。
  • 如果要查找的容器是有序的,可以考虑使用更高效的算法,如 std::binary_searchstd::lower_bound

小结

find() 函数是一个简单而强大的工具,用于在各种容器中查找元素。它的使用非常直观,通过传递开始和结束迭代器,以及要查找的值,即可轻松找到目标元素。在实际应用中,可以结合其他算法和数据结构,根据具体需求选择合适的查找方法。

5、STL中“大” “小”的概念

在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <algorithm>
using namespace std;class A
{int v;
public:A(int n) : v(n) {}bool operator < (const A& a2) const{cout << v << "<" << a2.v << "?" << endl;return false;// return v < a2.v; // 修改返回值为比较实际数值}bool operator == (const A& a2) const{cout << v << "==" << a2.v << "?" << endl;return v == a2.v;}
};int main()
{A a[] = {A(1), A(2), A(3), A(4), A(5)};// 修改为搜索整个数组范围// boolalpha:使 cout 输出布尔值时,显示 true 或 false 而不是 1 或 0。cout << boolalpha << binary_search(a, a + 5, A(9)) << endl; // 折半查找return 0;
}

代码逐行解释:
下面是对你提供的代码进行逐行解释:

#include <iostream>
#include <algorithm>
using namespace std;
  • #include <iostream>:包含输入输出流的头文件,用于输入输出操作,如cout
  • #include <algorithm>:包含标准库算法的头文件,用于调用binary_search函数。
  • using namespace std;:使用标准命名空间,避免在使用标准库对象时每次都加std::前缀。
class A
{int v;
public:A(int n) : v(n) {}bool operator < (const A& a2) const{cout << v << "<" << a2.v << "?" << endl;return false;// return v < a2.v; // 修改返回值为比较实际数值}bool operator == (const A& a2) const{cout << v << "==" << a2.v << "?" << endl;return v == a2.v;}
};
  • 定义一个类 A,表示一个包含整数成员变量 v 的类。
  • int v;:私有成员变量,存储整数值。
  • A(int n) : v(n) {}:构造函数,初始化成员变量 v 为传入的参数 n
  • bool operator < (const A& a2) const:重载小于运算符,用于比较两个 A 对象。输出比较信息,但总是返回 false(此处注释掉了实际的比较逻辑 return v < a2.v;)。
  • bool operator == (const A& a2) const:重载等于运算符,用于比较两个 A 对象。输出比较信息,并返回两个对象的 v 值是否相等。
int main()
{A a[] = {A(1), A(2), A(3), A(4), A(5)};// 修改为搜索整个数组范围cout << boolalpha << binary_search(a, a + 5, A(9)) << endl; // 折半查找return 0;
}
  • int main():主函数,程序执行的入口。
  • A a[] = {A(1), A(2), A(3), A(4), A(5)};:创建一个 A 对象数组,包含五个元素,每个元素的 v 值分别为 1, 2, 3, 4, 5
  • cout << boolalpha << binary_search(a, a + 5, A(9)) << endl;
    • binary_search(a, a + 5, A(9)):在数组 a 中使用二分查找法查找是否存在值为 9A 对象。
    • boolalpha:使 cout 输出布尔值时,显示 truefalse 而不是 10
    • 将查找结果输出到控制台,并换行。

5.1、重要说明

  • 当前的 operator < 函数总是返回 false,这会导致 binary_search 函数无法正确比较对象,因此始终返回 false。要使 binary_search 函数正常工作,需将 operator < 的实现改为实际比较数值,如下所示:
    bool operator < (const A& a2) const
    {cout << v << "<" << a2.v << "?" << endl;return v < a2.v;
    }
    
    这样可以正确地进行比较,并使二分查找能够正确地工作。

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

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

相关文章

leetcode119-Pascal‘s Triangle II

题目 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1] 分析 杨辉三角每位数字就是上一行同一列&#xff0b;上一行前一列的和&#…

结构体;结构成员访问操作符

结构体&#xff1a; 虽然c语言已经提供了内置类型&#xff0c;比如&#xff1a;char、short、int、long等&#xff0c;但还是不够用&#xff0c;就好比我描述一个人&#xff0c;我需要描述他的身高&#xff0c;体重&#xff0c;年龄&#xff0c;名字等信息&#xff0c…

微软密谋超级AI大模型!LangChain带你轻松玩转大模型开发

此前&#xff0c;据相关媒体报道&#xff0c;微软正在研发一款名为MAI-1的最新AI大模型&#xff0c;其参数规模或将达5000亿以上&#xff0c;远超此前微软推出的相关开源模型&#xff0c;其性能或能与谷歌的Gemini 1.5、Anthropic的Claude 3和OpenAI的GPT-4等知名大模型相匹敌。…

Linux文本处理三剑客(详解)

一、文本三剑客是什么&#xff1f; 1. 对于接触过Linux操作系统的人来说&#xff0c;应该都听过说Linux中的文本三剑客吧&#xff0c;即awk、grep、sed&#xff0c;也是必须要掌握的Linux命令之一&#xff0c;三者都是用来处理文本的&#xff0c;但侧重点各不相同&#xff0c;a…

Sam Altman微软Build 2024最新演讲:AI可能是下一个移动互联网

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

【C++11】lambda匿名函数和包装器

目录 一&#xff0c;lambda匿名函数 1-1&#xff0c;lambda的引入 1-2&#xff0c;lambda表达式书写格式 1-3&#xff0c;lambda函数的名称 1-4&#xff0c;lambda捕获列表的使用 1-5&#xff0c;函数对象与lambda表达式 二&#xff0c;包装器 2-1&#xff0c;function…

信息系统管理工程师知识点

信息系统管理工程师知识点 损坏包括自然灾害、物理损坏&#xff08;磁盘坏、设备使用寿命&#xff0c;外力破损&#xff09;、设备故障&#xff08;停电、电磁干扰&#xff09;。 泄漏包括电磁辐射&#xff08;侦听微机损伤过程&#xff09;、乘机而入&#xff08;合法用户进…

一天了解一个机器学习模型——机器学习基础知识

人工智能的两大任务——预测和决策 预测包括对输入目标的模式识别、标签分类、回归、预测未来数据、聚类 决策需要机器产生行动&#xff0c;改变状态&#xff0c;如下围棋、自动驾驶 支持人工智能的四大类技术 搜索——结合算法探索分支的好坏&#xff0c;从而做出决策&…

如何使用maven运行SpringBoot程序?

目录 一、什么是maven 二、什么是SpringBoot 三、如何使用maven运行SpringBoot程序&#xff1f; 一、什么是maven Maven&#xff1a;简化Java项目构建的自动化工具 在软件开发的世界里&#xff0c;Maven以其强大的项目管理和构建自动化功能&#xff0c;为Java开发者提供了…

内存泄漏及其解决方法

1. 系统崩溃前的现象 垃圾回收时间延长&#xff1a;从原本的约10ms增长至50ms&#xff0c;Full GC时间也由0.5s增加至4-5s。Full GC频率增加&#xff1a;最短间隔可缩短至1分钟内发生一次。年老代内存持续增长&#xff1a;即使经过Full GC&#xff0c;年老代内存未见明显释放。…

容器化:ES和Kibana

1 缘起 最近在学习使用ES&#xff0c; 为了找一个功能强大的可视化工具&#xff0c;之前使用了ES-Head&#xff0c;可以满足学习需求。 闲暇时间又折腾了另一个工具Kibana&#xff0c; 分享如下。 Kibana优点&#xff1a; 用户友好性&#xff1a;Kibana提供直观易用的用户界面…

Strategy设计模式

Strategy设计模式举例。 看图&#xff1a; 代码实现&#xff1a; #include <iostream>using namespace std;class FlyBehavior { public:virtual void fly() 0; };class QuackBehavior { public:virtual void quack() 0; };class FlyWithWings :public FlyBehavior …

数据库(vb.net+OleDB+Access)简易学生信息管理系统

在我们日常生活当中&#xff0c;数据库一词往往离不开我们的编程界&#xff0c;在学校、仓库等方面起着存储数据及数据关系作用的文件。相较于Excel&#xff0c;Access可以存储无限多的记录&#xff0c;内容也十分丰富&#xff0c;例如文本、数字、日期、T&F等。而且不需要…

k8s命令式对象管理和配置

kubectl补全: # dnf install -y bash-completion # echo "source <(kubectl completion bash)" >> ~/.bashrc # kubectl completion bash > /etc/bash_completion.d/kubectl 命令式对象管理 kubectl命令 # 查看所有pod kubectl get pod # 查看某个po…

gbk转utf-8

你们曾经有没有因为文件的编码问题而苦恼过&#xff1f;在Windows下开发时&#xff0c;尤其是项目初期&#xff0c;如果没有特别注意文件的字符编码问题&#xff0c;等到项目变大后&#xff0c;用Git对比代码时&#xff0c;很可能会发现一些乱码。这时才意识到字符编码的重要性…

LLM——探索大语言模型在心理学方面的应用研究

1. 概述 心理学经历了多次理论变革&#xff0c;目前人工智能&#xff08;AI&#xff09;和机器学习&#xff0c;特别是大型语言模型&#xff08;LLMs&#xff09;的使用&#xff0c;预示着新研究方向的开启。本文详细探讨了像ChatGPT这样的LLMs如何转变心理学研究。它讨论了LL…

docker- 镜像 导出导入

文章目录 前言docker- 镜像 导出导入1. 导出2. 删除镜像3. 导入镜像 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&…

Nginx 从入门到精通-Nginx-Web服务器的瑞士军刀

在当今互联网高速发展的时代&#xff0c;作为Web服务器的Nginx可谓是一把"瑞士军刀"&#xff0c;其强大的功能和出色的性能备受青睐。然而&#xff0c;仅仅停留在"会用"的层面是远远不够的&#xff0c;要充分发挥Nginx的潜力&#xff0c;我们还需要深入了解…

SpringBoot Validation自定义注解之校验指定最小整数

1&#xff0c;引入核心关键依赖 <!--数据校验--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency> 2&#xff0c;自定义注解 package com.taia.ym…

忘记“也是一门学问:机器如何忘记自己学到的知识?

在信息时代&#xff0c;我们常常希望人工智能能够学到更多的知识&#xff0c;变得更加智能。但你是否想过&#xff0c;有时候让机器"忘记"一些它学到的东西&#xff0c;也是一件很重要的事&#xff1f; 随着用户隐私保护意识的提高和相关法律法规的出台&#xff0c;…