C++:string (用法篇)

news2024/10/9 3:18:15

文章目录

  • 前言
  • 一、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

  1. 早期C/C++中的auto
    在C语言中,auto用于声明具有自动存储期的局部变量,表示变量在函数调用时自动分配并在函数返回时释放。因为局部变量默认具有自动存储期,所以auto修饰符不太被使用,逐渐变得不重要。

  2. C++11中的auto新含义
    C++11标准重新定义了auto,使其成为一种类型推导机制。编译器根据初始化的表达式,自动推导出变量的类型。例如:

    auto x = 10;    // x 的类型是 int
    auto y = 3.14;  // y 的类型是 double
    
  3. 指针和引用

    • 当使用auto声明指针时,autoauto*效果相同,编译器自动推导出指针类型:
      int* ptr = &x;
      auto p = ptr;  // p 的类型是 int*
      
    • 如果要声明引用,必须明确加上&
      int a = 5;
      auto& ref = a;  // ref 是 a 的引用
      
  4. 多个变量声明
    如果在一行中声明多个变量,所有变量必须是相同的类型。因为编译器只推导第一个变量的类型:

    auto x = 1, y = 2.5;  // 错误,x 是 int,y 是 double
    

    改为:

    auto x = 1; 
    auto y = 2.5;  // 正确
    
  5. 函数返回值
    auto不能用于函数参数类型,但可以用于推导函数返回值类型。不过要注意,这样用可能不直观

    auto func() {
        return 42;  // 返回类型为 int
    }
    
  6. 数组声明
    不能直接用auto声明数组,因为数组的大小是编译时必须明确的,编译器无法推导出数组的大小:

    auto arr[] = {1, 2, 3};  // 错误
    

2. 范围for

// 范围for C++11 语法糖
//	// 适用于容器遍历和数组遍历
//	// 自动取容器的数据赋值给左边的对象(仅仅是拷贝了一份,也就是赋值)
//	// 自动++,自动判断结束
//	// 原理:范围for底层是迭代器

基于范围的for循环概述
C++11引入了基于范围的for循环,主要是为了减少程序员在遍历时的工作量,避免手动设置迭代器或索引,从而简化代码,并降低出错的风险。语法为:

for (元素类型 变量名 : 容器) {
    // 对变量名进行操作
}
  • 第一部分元素类型 变量名):用来保存遍历过程中当前元素的拷贝或引用。
  • 第二部分容器):是要遍历的数组或容器。
  • 它会自动:
    • 迭代元素;
    • 提取数据;
    • 判断何时结束。

适用范围
范围for可以遍历数组容器对象(如std::vectorstd::list等),并且也能遍历自定义的类,只要这些类实现了迭代器接口。

示例代码

  1. 遍历数组

    int arr[] = {1, 2, 3, 4, 5};
    for (int num : arr) {
        std::cout << num << std::endl;
    }
    
  2. 遍历容器(如std::vector

    std::vector<int> vec = {10, 20, 30, 40};
    for (int val : vec) {
        std::cout << val << std::endl;
    }
    
  3. 通过引用遍历并修改元素
    如果你希望在遍历时修改容器中的元素,可以使用引用&

    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 < size
	s1.resize(15);
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;

	// 插入
	// size < n < capacity
	s1.resize(25, 'x');
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;

	// n > capacity
	s1.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

在这里插入图片描述
它的作用是在字符串后加入一个字符串。

  1. 字符串

    • 语法: append(const string& str)
    • 例子:
      string s = "Hello";
      s.append(" World");
      // s = "Hello World"
      
  2. 字符串的子串

    • 语法: append(const string& str, size_t subpos, size_t sublen)
    • 例子:
      string s = "Hello";
      s.append("World!", 0, 3); // 追加"World!"的前3个字符
      // s = "Hello Wor"
      
  3. C风格字符串

    • 语法: append(const char* s)
    • 例子:
      string s = "Hello";
      s.append(" World");
      // s = "Hello World"
      
  4. 字符数组的一部分

    • 语法: append(const char* s, size_t n)
    • 例子:
      string s = "Hello";
      s.append("World!!!", 5); // 只追加前5个字符
      // s = "Hello World"
      
  5. 重复指定字符

    • 语法: append(size_t n, char c)
    • 例子:
      string s = "Hello";
      s.append(3, '!');
      // s = "Hello!!!"
      
  6. 迭代器范围

    • 语法: 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

在这里插入图片描述

  1. 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用法的讲解就结束啦~

谢谢大家~

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

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

相关文章

第33次CCF计算机软件能力认证-第4题十滴水

题干&#xff1a; 十滴水是一个非常经典的小游戏。 小 C C C 正在玩一个一维版本的十滴水游戏。 我们通过一个例子描述游戏的基本规则。 游戏在一个 1 c 1c 1c 的网格上进行&#xff0c;格子用整数 x ( 1 ≤ x ≤ c ) x(1≤x≤c) x(1≤x≤c) 编号&#xff0c;编号从左往…

Metal之旅——数据

顶点数据 顶点数据&#xff08;Vertex Data&#xff09;是指一系列顶点的集合&#xff0c;这些顶点用于图形渲染管线的输入。每个顶点通常包含位置、颜色、纹理坐标等属性信息 mesh网络 Mesh网络是指metal中通过将不同数量形状的三角形拼在一起覆盖在要绘制图形表面的网络 顶…

007集—— 自动获取图形的外边界(外轮廓)(CAD—C#二次开发入门)

本文只适用于闭合多段线组成的图像,其他情况(圆、弧、椭圆、未封闭line)暂不支持。 效果如下图所示: 原始图: 代码运行后图: 附代码: public class 外轮廓{Database db = HostApplicationServices.WorkingDatabase;[CommandMethod("xx")]public void Demo(…

基于SSM车位租赁系统【附源码】

基于SSM车位租赁系统 效果如下&#xff1a; 注册页面 首页展示 车位租赁订单展示 车位列表页面 公告信息管理页面 公告类型管理界面 研究背景 随着经济的持续增长和城市化进程的加速&#xff0c;土地资源变得日益紧缺&#xff0c;停车难问题已成为许多城市面临的共同挑战。随…

【Redis】List类型的常用命令大全

这里的list列表相当于一个双端队列&#xff0c;也可以认为是双向链表&#xff0c;也可以认为是数组&#xff0c;后续的很多命令都使用到下标。 list的特点&#xff1a; list中的每个元素也都是String类型里面的元素可以重复列表中的元素是有序的&#xff0c;如果里面元素顺序进…

epoll究竟是同步的还是异步的?

简单说一句话&#xff0c;你需要分层看这个事&#xff1a; epoll 这个系统调用&#xff0c;是同步的&#xff0c;也就是必须等待操作系统返回值。 而底层用了 epoll 的封装后的框架&#xff0c;可以是异步的&#xff0c;只要你暴露给外部的接口&#xff0c;无需等待你的返回值…

DDD简介

概述 传统的数据驱动开发模式&#xff0c;View、Service、Dao这种三层分层模式&#xff0c;会很自然的写出过程式代码&#xff0c;这种开发方式中的对象只是数据载体&#xff0c;而没有行为&#xff0c;是一种贫血对象模型。以数据为中心&#xff0c;以数据库ER图为设计驱动&a…

什么是变阻器?

变阻器是一种电子元件&#xff0c;主要用于调整电路中的电阻值&#xff0c;从而实现对电流、电压等电学参数的控制。它在电路中起到非常重要的作用&#xff0c;广泛应用于各种电子设备和实验装置中。 变阻器的主要作用是改变电路中的电阻值。在电路中&#xff0c;电阻值的大小…

二部图简单理解

目录 二部图简单理解 一、定义 二、性质与定理 三、原理举例 四、应用 二部图简单理解 二部图(Bipartite Graph),又称二分图,是图论中的一种特殊模型。以下是对二部图的详细介绍及原理举例: 一、定义 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(…

目标检测or实例分割中AP、MAP的计算

参考链接&#xff1a; 目标检测中AP、MAP的计算_51CTO博客_目标检测map计算 举个例子&#xff1a;

【JVM】内存分析工具JConsole/Visual VM

1 缘起 日常补充JVM调优&#xff0c;调优实践前需要学习一些理论做支撑&#xff0c; JVM调优三步&#xff1a;理论>GC分析>JVM调优&#xff0c; 我们会有一些玩笑话说&#xff0c;做了这么久Java开发&#xff0c;做过JVM调优吗&#xff1f; 做过&#xff0c;面试时。当然…

【深度学习】yolov8n模型的剪枝操作记录

原始 剪枝微调后 可以看到模型大小了&#xff0c; 测试结果显示再cpu 上加速5%-10% from ultralytics import YOLOimport time # Load a pretrained YOLO11n model count_num 500 def test1():model YOLO("/home/justin/Desktop/code/v8_prun/runs/detect/train3/weig…

LC刷题专题:记忆化搜索

文章目录 576. 出界的路径数 本刷题专栏记录自己的记忆化搜索的做题。 576. 出界的路径数 题目链接及描述&#xff1a; https://leetcode.cn/problems/out-of-boundary-paths/description/ 第一次看到这个题目可能先入为主了&#xff0c;首先想到的是使用动态规划做&#xff…

19.安卓逆向-frida基础-hook分析调试技巧1-hookMD5

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。 工…

C#多线程基本使用和探讨

线程是并发编程的基础概念之一。在现代应用程序中&#xff0c;我们通常需要执行多个任务并行处理&#xff0c;以提高性能。C# 提供了多种并发编程工具&#xff0c;如Thread、Task、异步编程和Parallel等。 Thread 类 Thread 类是最基本的线程实现方法。使用Thread类&#xff0…

【题解】【模拟】—— [NOIP2013 普及组] 表达式求值

【题解】【模拟】—— [NOIP2013 普及组] 表达式求值 [NOIP2013 普及组] 表达式求值题目背景题目描述输入格式输出格式输入输出样例输入 #1输出 #1输入 #2输出 #2输入 #3输出 #3 提示 1.简单做法1.1.题意解析1.2.AC代码 2.使用栈的做法2.1.题意解析2.2.AC代码 [NOIP2013 普及组…

C高级--shell脚本实现分支判断

题目&#xff1a; 分支结构结合test指令完成一下编程 1>判断闰年 2>输入一个数判断是否为偶数 3>使用test指令实现等级判断 90--100A 60--89B 0-50C 其他错误 代码如下&#xff1a; #!/bin/bash read -p "请输入一个年份&#xff1a;" year if [ $((y…

Cisco Meraki平台登陆

登陆以下网址 https://n4.meraki.cn/ 输入之前注册的邮箱&#xff0c;点击Next 输入之前注册时输入的密码&#xff0c;注意不是企业邮箱的密码&#xff01; 查看邮箱&#xff0c;将验证码输入&#xff0c;点击Verify&#xff08;验证&#xff09;&#xff0c;此验证码10分…

C语言-文件IO

文件IO I :input 输入&#xff0c;从文件中读取数据到内存 O:output 输出&#xff0c;把数据写入到文件 Linux系统IO 和 c语言标准IO 1、linux系统IO 1.1 简介 linux操作系统把对文件的操作封装成了多个函数&#xff0c;统称为linux系统IO。 文件描述符(File descirptor)…

笔试算法day01

目录 1.除2 2.Fibonacci数列&#xff08;Fib 数列&#xff09; 3.单词搜索 1.除2 除2&#xff01; (nowcoder.com) 算法思路&#xff1a; 只需要对最大的n个偶数进行/2即可。 将所有的偶数存进大根堆中&#xff0c;执行k次操作即可 #include <iostream> #include <…