【C++初阶】C++STL详解(一)—— string类

news2024/11/26 15:52:47

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:C++初阶
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • C++STL详解(一)—— sring类
  • 1. string的定义方式
  • 2. string的插入
  • 3.string的拼接
  • 4.string的删除
  • 5.string的查找
  • 6.string的比较
  • 7.string的替换
  • 8.string的交换
  • 9.string的大小和容量
  • 10.string中元素的访问
  • 11.string中运算符的使用
  • 12.string中与迭代器相关的函数
  • 13.string与字符串之间的转换
  • 14.string中子字符串的提取
  • 15.string中的getline函数
  • 16.总结:

C++STL详解(一)—— sring类

1. string的定义方式

string类实现了多个构造函数的重载,常用的构造函数如下:

string();  //构造一个空字符串

string(const char* s);  //复制s所指的字符序列

string(const char* s, size_t n);  //复制s所指字符序列的前n个字符

string(size_t n, char c);  //生成n个c字符的字符串

string(const string& str);  //生成str的复制品

string(const string& str, size_t pos, size_t len = npos);  //复制str中从字符位置pos开始并跨越len个字符的部分

使用示例:

string s1;                     //构造空字符串
string s2("hello string");     //复制"hello string"
string s3("hello string", 3);  //复制"hello string"的前3个字符
string s4(10, 's');            //生成10个's'字符的字符串
string s5(s2);                 //生成s2的复制品
string s6(s2, 0, 4);           //复制s2中从字符位置0开始并跨越4个字符的部分

2. string的插入

1、使用push_back进行尾插–插入单个字符
append–插入字符串

void push_back (char c);

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s;
	s.push_back('C');
	s.push_back('S');
	s.push_back('D');
	s.push_back('N');
	cout << s << endl; //CSDN
	
	s.append("hello");
	cout << s << endl; //CSDNhello
	return 0;
}

2、使用insert插入

string& insert (size_t pos, const string& str);
string& insert (size_t pos, const char* s);
iterator insert (iterator p, char c);

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("C"); //C

	//insert(pos, str)在pos位置插入字符串str
	s.insert(1, "S"); //CS

	//insert(pos, string)在pos位置插入string对象
	string t("D");
	s.insert(2, t); //CSD

	//insert(pos, char)在pos位置插入字符char
	s.insert(s.end(), 'N'); //CSDN
	
	cout << s << endl; //CSDN
	return 0;
}

3.string的拼接

使用append函数完成string的拼接:

string& append (const string& str);
string& append (const char* s);
string& append (size_t n, char c);

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s1("I");
	string s2(" like");

	//append(string)完成两个string对象的拼接
	s1.append(s2); //I like

	//append(str)完成string对象和字符串str的拼接
	s1.append(" C++"); //I like C++

	//append(n, char)将n个字符char拼接到string对象后面
	s1.append(3, '!'); //I like C++!!!
	
	cout << s1 << endl; //I like C++!!!
	return 0;
}

4.string的删除

1、使用pop_back进行尾删

void pop_back();

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("C++");
	s.pop_back();
	s.pop_back();
	cout << s << endl; //C
	return 0;
}

2、使用erase删除

string& erase (size_t pos = 0, size_t len = npos);
iterator erase (iterator p);
iterator erase (iterator first, iterator last);

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("I like C++");

	//erase(pos, n)删除pos位置开始的n个字符
	s.erase(8, 5); //I like C

	//erase(pos)删除pos位置的字符
	s.erase(s.end()-1); //I like

	//erase(pos1, pos2)删除[pos1pos2)上所有字符
	s.erase(s.begin() + 1, s.end()); //I

	cout << s << endl; //I
	return 0;
}

5.string的查找

1、使用find函数正向搜索第一个匹配项

size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
size_t find (char c, size_t pos = 0) const;

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s1("http://www.cplusplus.com/reference/string/string/find/");

	//find(string)正向搜索与string对象所匹配的第一个位置
	string s2("www");
	size_t pos1 = s1.find(s2);
	cout << pos1 << endl; //7

	//find(str)正向搜索与字符串str所匹配的第一个位置
	char str[] = "cplusplus.com";
	size_t pos2 = s1.find(str);
	cout << pos2 << endl;  //11

	//find(char)正向搜索与字符char所匹配的第一个位置
	size_t pos3 = s1.find(':');
	cout << pos3 << endl; //4
	return 0;
}

2、使用rfind函数反向搜索第一个匹配项

size_t rfind (const string& str, size_t pos = npos) const;
size_t rfind (const char* s, size_t pos = npos) const;
size_t rfind (char c, size_t pos = npos) const;

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s1("http://www.cplusplus.com/reference/string/string/find/");

	//rfind(string)反向搜索与string对象所匹配的第一个位置
	string s2("string");
	size_t pos1 = s1.rfind(s2);
	cout << pos1 << endl; //42

	//rfind(str)反向搜索与字符串str所匹配的第一个位置
	char str[] = "reference";
	size_t pos2 = s1.rfind(str);
	cout << pos2 << endl;  //25

	//rfind(char)反向搜索与字符char所匹配的第一个位置
	size_t pos3 = s1.rfind('/');
	cout << pos3 << endl; //53
	return 0;
}

在这里插入图片描述
在这里插入图片描述
3、find_first_of()函数

size_t find_first_of (const string& str, size_t pos = 0) const;
size_t find_first_of (const char* s, size_t pos = 0) const;
size_t find_first_of (const char* s, size_t pos, size_t n) const;
size_t find_first_of (char c, size_t pos = 0) const;

正向查找在原字符串中第一个与指定字符串(或字符)中的某个字符匹配的字符,返回它的位置。若查找失败,则返回npos。(npos定义为保证大于任何有效下标的值。)

#include<iostream>
using namespace std;
int main()
{
    string str="abcdefab";
    cout<<str.find_first_of('a')<<endl;//第二个参数为0,默认从下标为0开始查找。
    cout<<str.find_first_of("hce")<<endl;//待查串hce第一个出现在原串str中的字符是c,返回str中c的下标2,故结果为2。
    cout<<str.find_first_of("ab",1)<<endl;//从下标为1开始查,待查串ab第一个出现在原串str中的字符是b,返回b的下标,结果为1。
    cout<<str.find_first_of('h')<<endl;//原串没有待查字符h,故查不到,返回npos。
    cout<<str.find_first_of("hw")<<endl;//待查子串任一字符在原串中都找不到,故查不到,返回npos。

    return 0;
}
//有效的下标应该在0~len-1范围内。len=str.size();

4、find_last_of()函数

size_t find_last_not_of (const string& str, size_t pos = npos) const;
size_t find_last_not_of (const char* s, size_t pos = npos) const;
size_t find_last_not_of (const char* s, size_t pos, size_t n) const;
size_t find_last_not_of (char c, size_t pos = npos) const;

逆向查找在原字符串中最后一个与指定字符串(或字符)中的某个字符匹配的字符,返回它的位置。若查找失败,则返回npos。(npos定义为保证大于任何有效下标的值。)

#include<iostream>
using namespace std;
int main()
{
    string str="abcdefab";
   
    cout<<str.find_last_of("wab")<<endl;//原串最后一个字符首先与待查子串的每一个字符一一比较,一旦有相同的就输出原串该字符的下标.。结果为b的下标7。
    cout<<str.find_last_of("wab",5)<<endl;
    //从原串中下标为5开始逆向查找,首先f与待查子串每一字符比较,若有相同的就输出该字符在原串的下标。
    //若一个都没有,就依次逆向比较,即e再与待查子串一一比较,直到原串的b与待查子串中的b相同,然后输出该b在原串的下标1。
    cout<<str.find_last_of("fab",5)<<endl;//输出f在原串的下标5。
    cout<<str.find_last_of("fab",7)<<endl;//输出b在原串的下标7。
    cout<<str.find_last_of("hwk")<<endl;//原串没有待查子串的任何字符,故返回npos。
    return 0;
}
//有效的下标应该在0~len-1范围内。len=str.size();

6.string的比较

使用compare函数完成比较:

int compare (const string& str) const;
int compare (size_t pos, size_t len, const string& str) const;
int compare (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen) const;

比较规则:
 1、比较字符串中第一个不匹配的字符值较小,或者所有比较字符都匹配,但比较字符串较短,则返回小于0的值。
 2、比较字符串中第一个不匹配的字符值较大,或者所有比较字符都匹配,但比较字符串较长,则返回大于0的值。
 3、比较的两个字符串相等,则返回0。

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s1("hello world");
	string s2("hello CSDN");

	//"hello world"和"hello CSDN"比较
	cout << s1.compare(s2) << endl; //1

	//"ell"和"hello CSDN"比较
	cout << s1.compare(1, 3, s2) << endl; //-1

	//"hello"和"hello"比较
	cout << s1.compare(0, 4, s2, 0, 4) << endl; //0

	return 0;
}

注意:除了支持string类之间进行比较,compare函数还支持string类和字符串进行比较。

7.string的替换

使用replace函数完成string的替换:

string& replace (size_t pos, size_t len, const char* s);
string& replace (size_t pos, size_t len, size_t n, char c);

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("hello world");

	//replace(pos, len, str)将pos位置开始的len个字符替换为字符串str
	s.replace(6, 4, "CSDN"); //hello CSDNd

	//replace(pos, len, n, char)将pos位置开始的len个字符替换为n个字符char
	s.replace(10, 1, 3, '!'); //hello CSDN!!!

	cout << s << endl;
	return 0;
}

但一般不使用repalce,因为要挪动数据,时间复杂度较高,而是通过空间换时间,比如下面这道题:

在这里插入图片描述

8.string的交换

使用swap函数完成两个string类的交换:

void swap (string& x, string& y);
void swap (string& str);

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s1("hello");
	string s2("CSDN");
	
	//使用string类的成员函数swap交换s1和s2
	s1.swap(s2);
	cout << s1 << endl; //CSDN
	cout << s2 << endl; //hello

	//使用非成员函数swap交换s1和s2
	swap(s1, s2);
	cout << s1 << endl; //hello
	cout << s2 << endl; //CSDN
	return 0;
}

9.string的大小和容量

1、使用size函数或length函数获取当前有效字符的个数

size_t size() const;
size_t length() const;

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("CSDN");
	cout << s.size() << endl; //4
	cout << s.length() << endl; //4
	return 0;
}

2、使用max_size函数获取string对象对多可包含的字符数

size_t max_size() const;

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("CSDN");
	cout << s.max_size() << endl; //4294967294
	return 0;
}

3、使用capacity函数获取当前对象所分配的存储空间的大小

size_t capacity() const;

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("CSDN");
	cout << s.capacity() << endl; //15
	return 0;
}

4、使用resize改变当前对象的有效字符的个数

void resize (size_t n);
void resize (size_t n, char c);

resize规则:
 1、当n大于对象当前的size时,将size扩大到n,扩大的字符为c,若c未给出,则默认为’\0’。
 2、当n小于对象当前的size时,将size缩小到n。

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s1("CSDN");
	//resize(n)n大于对象当前的size时,将size扩大到n,扩大的字符默认为'\0'
	s1.resize(20);
	cout << s1 << endl; //CSDN
	cout << s1.size() << endl; //20
	cout << s1.capacity() << endl; //31

	string s2("CSDN");
	//resize(n, char)n大于对象当前的size时,将size扩大到n,扩大的字符为char
	s2.resize(20, 'x');
	cout << s2 << endl; //CSDNxxxxxxxxxxxxxxxx
	cout << s2.size() << endl; //20
	cout << s2.capacity() << endl; //31

	string s3("CSDN");
	//resize(n)n小于对象当前的size时,将size缩小到n
	s3.resize(2);
	cout << s3 << endl; //CS
	cout << s3.size() << endl; //2
	cout << s3.capacity() << endl; //15
	return 0;
}

注意:若给出的n大于对象当前的capacity,则capacity也会根据自己的增长规则进行扩大->进行开空间+初始化

5、使用reserve改变当前对象的容量大小

void reserve (size_t n = 0);

reserve规则:
 1、当n大于对象当前的capacity时,将capacity扩大到n或大于n。
 2、当n小于对象当前的capacity时,什么也不做。

注意:如果使用clear()清理了数据,会缩容,反之不会缩容;但不建议缩容,否则时间换空间(开辟小空间、拷贝、释放之前的大空间)->不值得


#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("CSDN");
	cout << s << endl; //CSDN
	cout << s.size() << endl; //4
	cout << s.capacity() << endl; //15

	//reverse(n)当n大于对象当前的capacity时,将当前对象的capacity扩大为n或大于n
	s.reserve(20); 
	cout << s << endl; //CDSN
	cout << s.size() << endl; //4
	cout << s.capacity() << endl; //31

	//reverse(n)当n小于对象当前的capacity时,什么也不做
	s.reserve(2);
	cout << s << endl; //CDSN
	cout << s.size() << endl; //4
	cout << s.capacity() << endl; //31
	return 0;
}

注意:此函数对字符串的size没有影响,并且无法更改其内容。只进行开空间->减少消耗,提高效率

6、使用clear删除对象的内容,删除后对象变为空字符串

void clear();

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("CSDN");

	//clear()删除对象的内容,该对象将变为空字符串
	s.clear();
	cout << s << endl; //空字符串
	return 0;
}

7、使用empty判断对象是否为空

bool empty() const;

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("CSDN");
	cout << s.empty() << endl; //0

	//clear()删除对象的内容,该对象将变为空字符串
	s.clear();
	cout << s.empty() << endl; //1
	return 0;
}

10.string中元素的访问

1、[ ]+下标
 因为string类对[ ]运算符进行了重载,所以我们可以直接使用[ ]+下标访问对象中的元素。并且该重载使用的是引用返回,所以我们可以通过[ ]+下标修改对应位置的元素。

char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("CSDN");
	//[]+下标访问对象元素
	for (size_t i = 0; i < s.size(); i++)
	{
		cout << s[i];
	}
	cout << endl;

	//[]+下标修改对象元素内容
	for (size_t i = 0; i < s.size(); i++)
	{
		s[i] = 'x';
	}
	cout << s << endl; //xxxx
	return 0;
}

在这里插入图片描述

2、使用at访问对象中的元素
 因为at函数也是使用的引用返回,所以我们也可以通过at函数修改对应位置的元素。

char& at (size_t pos);
const char& at (size_t pos) const;

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("CSDN");
	for (size_t i = 0; i < s.size(); i++)
	{
		//at(pos)访问pos位置的元素
		cout << s.at(i);
	}
	cout << endl;

	for (size_t i = 0; i < s.size(); i++)
	{
		//at(pos)访问pos位置的元素,并对其进行修改
		s.at(i) = 'x';
	}
	cout << s << endl; //xxxx
	return 0;
}

在这里插入图片描述

3、使用范围for访问对象中的元素
 需要特别注意的是:若是需要通过范围for修改对象的元素,则用于接收元素的变量e的类型必须是引用类型,否则e只是对象元素的拷贝,对e的修改不会影响到对象的元素。

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("CSDN");
	//使用范围for访问对象元素
	for (auto e : s)
	{
		cout << e;
	}
	cout << endl; //CSDN

	//使用范围for访问对象元素,并对其进行修改
	for (auto& e : s) //需要修改对象的元素,e必须是引用类型
	{
		e = 'x';
	}
	cout << s << endl; //xxxx
	return 0;
}

其实,范围for的底层就是迭代器

4、使用迭代器访问对象中的元素

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("CSDN");
	
	//使用迭代器访问对象元素
	string::iterator it1 = s.begin();
	while (it1 != s.end())
	{
		cout << *it1;
		it1++;
	}
	cout << endl; //CSDN

	//使用迭代器访问对象元素,并对其进行修改
	string::iterator it2 = s.begin();
	while (it2 != s.end())
	{
		*it2 += 1;
		it2++;
	}
	cout << s << endl; //DTEO
	return 0;
}

11.string中运算符的使用

1、operator=
 string类中对=运算符进行了重载,重载后的=运算符支持string类的赋值、字符串的赋值以及字符的赋值。

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s1;
	string s2("CSDN");

	//支持string类的赋值
	s1 = s2;
	cout << s1 << endl; //CSDN

	//支持字符串的赋值
	s1 = "hello";
	cout << s1 << endl;  //hello

	//支持字符的赋值
	s1 = 'x';
	cout << s1 << endl; //x
	return 0;
}

2、operator+=
 string类中对+=运算符进行了重载,重载后的+=运算符支持string类的复合赋值、字符串的复合赋值以及字符复合的赋值。

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s1;
	string s2("hello");

	//支持string类的复合赋值
	s1 += s2;
	cout << s1 << endl; //hello

	//支持字符串的复合赋值
	s1 += " CSDN";
	cout << s1 << endl; //hello CSDN

	//支持字符的复合赋值
	s1 += '!';
	cout << s1 << endl; //hello CSDN!
	return 0;
}

其实,operator+=的底层就是调用的push_back和append

3、operator+

string类中对+运算符进行了重载,重载后的+运算符支持以下几种类型的操作:
 string类 + string类
 string类 + 字符串
 字符串 + string类
 string类 + 字符
 字符 + string类
它们相加后均返回一个string类对象。

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s;
	string s1("super");
	string s2("man");
	char str[] = "woman";
	char ch = '!';

	//string类 + string类
	s = s1 + s2;
	cout << s << endl; //superman

	//string类 + 字符串
	s = s1 + str;
	cout << s << endl; //superwoman

	//字符串 + string类
	s = str + s1;
	cout << s << endl; //womansuper

	//string类 + 字符
	s = s1 + ch;
	cout << s << endl; //super!
	
	//字符 + string类
	s = ch + s1;
	cout << s << endl; //!super
	return 0;
}

4、operator>> 和 operator<<
 string类中也对>>和<<运算符进行了重载,这就是为什么我们可以直接使用>>和<<对string类进行输入和输出的原因。

istream& operator>> (istream& is, string& str);
ostream& operator<< (ostream& os, const string& str);

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s;
	cin >> s; //输入
	cout << s << endl; //输出
	return 0;
}

5、!=、<、<=、>等
 string类中还对一系列关系运算符进行了重载,它们分别是==、!=、<、<=、>、>=。重载后的关系运算符支持string类和string类之间的关系比较、string类和字符串之间的关系比较、字符串和string类之间的关系比较。

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s1("abcd");
	string s2("abde");
	cout << (s1 > s2) << endl; //0
	cout << (s1 < s2) << endl; //1
	cout << (s1 == s2) << endl; //0
	return 0;
}

注意:这些重载的关系比较运算符所比较的都是对应字符的ASCII码值

12.string中与迭代器相关的函数

1、与正向迭代器相关的函数
begin函数:返回一个指向字符串第一个字符的迭代器。

函数原型:

iterator begin();
 const_iterator begin() const;

end函数:返回一个指向字符串结束字符的迭代器,即’\0’。

函数原型:

iterator end();
 const_iterator end() const;

使用示例:

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("hello");

	//正向迭代器
	string::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it;
		it++;
	}
	cout << endl; //hello

	return 0;
}

在这里插入图片描述

2、与反向迭代器相关的函数
rbegin函数:返回指向字符串最后一个字符的反向迭代器。

函数原型:

reverse_iterator rbegin();
 const_reverse_iterator rbegin() const;

rend函数:返回指向字符串第一个字符前面的理论元素的反向迭代器。

函数原型:

reverse_iterator rend();
 const_reverse_iterator rend() const;

使用示例:

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("hello");

	//反向迭代器
	string::reverse_iterator rit = s.rbegin();
	while (rit != s.rend())
	{
		cout << *rit;
		rit++;
	}
	cout << endl; //olleh

	return 0;
}

在这里插入图片描述

13.string与字符串之间的转换

1、将字符串转换为string
 将字符串转换为string很简单,在前面讲string的定义方式时就有说到。

#include <iostream>
#include <string>
using namespace std;
int main()
{
	//方式一
	string s1("hello world");

	//方式二
	char str[] = "hello world";
	string s2(str);

	cout << s1 << endl; //hello world
	cout << s2 << endl; //hello world
	return 0;
}

2、使用c_str或data将string转换为字符串

const char* c_str() const;
const char* data() const;

区别:

在C++98中,c_str()返回 const char* 类型,返回的字符串会以空字符结尾。
在C++98中,data()返回 const char* 类型,返回的字符串不以空字符结尾。

但是在C++11版本中,c_str()与data()用法相同。

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("hello world ");
	const char* str1 = s.data();
	const char* str2 = s.c_str();

	cout << str1 << endl;
	cout << str2 << endl;
	return 0;
}

兼容C语言,相互配合:

在这里插入图片描述

C语言与C++中字符串读取结束的区别:

在这里插入图片描述

14.string中子字符串的提取

1、使用substr函数提取string中的子字符串

string substr (size_t pos = 0, size_t len = npos) const;

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string ur1 = "https://cplusplus.com/reference/string/string/";
	size_t pos1 = ur1.find("://");
	string protocol;//协议
	if (pos1 != string::npos)//找到了
	{
		protocol = ur1.substr(0, pos1);//substr(pos, n)提取pos位置开始的n个字符序列作为返回值
	}
	cout << protocol << endl;

	string domain;//域名
	string uri;//资源名

	size_t pos2 = ur1.find("/", pos1 + 3);
	if (pos1 != string::npos)//找到了
	{
		domain = ur1.substr(pos1 + 3, pos2 - (pos1 + 3));
		uri = ur1.substr(pos2 + 1);
	}
	cout << domain << endl;
	cout << uri << endl;
	return 0;
}

在这里插入图片描述

2、使用copy函数将string的子字符串复制到字符数组中

size_t copy (char* s, size_t len, size_t pos = 0) const;

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("abcdef");
	char str[20];

	//copy(str, n, pos)复制pos位置开始的n个字符到str字符串
	size_t length = s.copy(str, 4, 2);
	//copy函数不会在复制内容的末尾附加'\0',需要手动加
	str[length] = '\0';
	cout << str << endl; //dcef
	return 0;
}

15.string中的getline函数

在使用>>进行输入操作时,当>>读取到空格便会停止读取,基于此,我们将不能用>>将一串含有空格的字符串读入到string对象中。

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s;
	cin >> s; //输入:hello CSDN
	cout << s << endl; //输出:hello
	return 0;
}

这时,我们就需要用getline函数完成一串含有空格的字符串的读取操作了。

用法一:

istream& getline (istream& is, string& str);

getline函数将从is中提取到的字符存储到str中,直到读取到换行符’\n’为止。

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s;
	getline(cin, s); //输入:hello CSDN
	cout << s << endl; //输出:hello CSDN
	return 0;
}

用法二:

istream& getline (istream& is, string& str, char delim);

getline函数将从is中提取到的字符存储到str中,直到读取到分隔符delim或换行符’\n’为止。

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s;
	getline(cin, s, 'D'); //输入:hello CSDN
	cout << s << endl; //输出:hello CS
	return 0;
}

16.总结:

今天我们认识并具体学习了STL中string类,开启了STL学习的大门。接下来,我们将进行STL中string类的模拟实现。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

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

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

相关文章

6.3 SpringBoot日志进阶实战 Logback配置详解

文章目录 前言一、Logback入门级配置二、动态指定属性三、动态指定日志级别四、指定配置文件五、滚动记录RollingFIleAppender六、异步记录AsyncAppender总结最后 前言 在上一篇文章中&#xff0c;我和你介绍了SpringBoot快速入门Slf4j Logback实战&#xff0c;遗留的问题是如…

数据中心末端配电的数字化方案及设备选型

普通PDU和智能PDU有什么区别&#xff1f; 机架安装配电盘或机架配电单元 (PDU) 是一种配备许多插座的设备&#xff0c;可将电力分配给位于数据中心机架或机柜内的服务器、存储设备和网络设备。领先的分析公司 IHS 将它们分为两大类&#xff1a; 1) 基本 PDU 提供可靠的配电。 2…

【2023 · CANN训练营第一季】TIK C++算子开发入门 第一章——TIK C++算子开发入门

1.TIK C介绍 TIK C是一种使用C/C作为前端语言的算子开发工具&#xff0c;通过四层接口抽象、并行编程范式、孪生调试等技术&#xff0c;极大提高算子开发效率&#xff0c;助力AI开发者低成本完成算子开发和模型调优部署 使用TIK C开发自定义算子的优势&#xff1a; (1)C/C原语…

如何编写代码审查文档

一、前言 代码审查(Code Review)是开发流程中非常重要的一个环节&#xff0c;可以帮助发现并改正代码中的错误&#xff0c;提高代码质量&#xff0c;也是共享知识、熟悉代码的好机会。 最近功能开发完毕需要做代码审查&#xff0c;发现国内很多公司不强制要求编写代码审查文档…

【Linux内网穿透】】Linux本地搭建GitLab服务器 - 内网穿透远程访问

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar内网穿透5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 转载自cpolar极点云文章&#xff1a;Linux搭建GitLab私有仓库&#xff0c;并内网穿透实…

chatgpt赋能python:Python的就业前景——解析云计算与Python的结合

Python的就业前景——解析云计算与Python的结合 Python是一种高级编程语言&#xff0c;具有高度的可读性和简洁性&#xff0c;并已成为Web和大数据的主流语言之一。Python广泛应用于数据科学&#xff0c;机器学习&#xff0c;Web开发&#xff0c;游戏开发和金融等领域&#xf…

Linux_epoll

Linux_epoll 思考:高效的餐厅服务如何实现?Epoll - Reactor 设计模式Epoll 与 Reactor 设计模式的关系Reactor优点Epoll - IO多路复用的用法web_server示例代码水平触发和边缘触发思考:高效的餐厅服务如何实现? 一个顾客来就餐,一个服务员在顾客点菜期间全程陪同服务! 一个…

并发编程总结

synchronized synchronized有如下3种使用方式 普通同步方法&#xff0c;锁是当前实例对象 静态同步方法&#xff0c;锁是当前类的class对象 同步方法块&#xff0c;锁是括号里面的对象 当一个线程访问同步代码块时&#xff0c;需要获得锁才能执行&#xff0c;当退出或者抛…

chatgpt赋能python:Python修改BIOS:一篇专业的SEO文章

Python修改BIOS&#xff1a;一篇专业的SEO文章 介绍 BIOS&#xff08;Basic Input/Output System&#xff09;是计算机中的核心程序&#xff0c;它负责启动电脑并管理硬件。一旦发现硬件问题&#xff0c;BIOS会通知用户或操作系统。它还可以设置系统的参数&#xff0c;例如时…

Node.js安装教程(npm搭建) - Window

择心】向大家介绍安装Node.js ( npm搭建 ) 一、安装流程 进入Node.js 去下载一个安装包。 双击下载好的应用程序,弹出安装界面并点击Next&#xff0c; 接受协议&#xff0c;点击Next&#xff0c; 更改默认安装路径&#xff0c;点击Next&#xff0c; 会默认添加到Path环境…

【每周一书】--(认知觉醒)思考:如何用清爽的情绪面对内卷的当下?

【每周一书】--&#xff08;认知觉醒&#xff09;思考&#xff1a;如何用清爽的情绪面对内卷的当下&#xff1f; 认知觉醒&#xff1a;开启自我改变的原动力焦虑&#xff1a;焦虑的根源完成焦虑定位焦虑选择焦虑环境焦虑难度焦虑 如何拥有清爽的情绪&#xff0c;释放焦虑情绪 认…

记录使用Pytorch分布式训练(torch.distributed)踩过的坑

引言 最近由于想加速神经网络模型训练&#xff0c;便开始着手学习pytorch的分布式训练&#xff08;DDP&#xff09;&#xff0c;结果踩了很多坑&#xff0c;在这里记录一下&#xff0c;便于以后查看&#xff0c;也同时分享给大家。 教程 我是通过下面几篇博客学习pytorch分布…

JVM类加载器及其详解

1.JVM加载过程分析 1.1加载流程图 1.2双亲委派机制 引导类加载器&#xff1a;负责加载支撑JVM运行的位于JRE的lib目录下的核心类库&#xff0c;比如rt.jar、charsets.jar等扩展类加载器&#xff1a;负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR类包应用程序…

chatgpt赋能python:Python倒序的实现方法介绍

Python倒序的实现方法介绍 Python是一种高级编程语言&#xff0c;被广泛用于数据处理、人工智能、Web开发等领域。其中&#xff0c;倒序是常见的一种操作需求。Python提供了多种实现倒序的方法&#xff0c;下面进行详细介绍。 1. 切片 切片是Python中常用的语法&#xff0c;…

chatgpt赋能python:Python倒序循环–优化你的编程效率

Python倒序循环 – 优化你的编程效率 在Python编程中&#xff0c;倒序循环是一种非常强大的操作。它可以用于遍历一个序列并对其中的元素进行逆序处理&#xff0c;从而提高编程效率。本文将介绍Python倒序循环的优势及如何在编程中使用。 什么是Python倒序循环 在传统循环中…

Web应用技术(第十五周/END)

本次练习基于how2j和课本&#xff0c;进行SSM的初步整合&#xff0c;理解SSM整合的原理、好处。 SSM整合应用 1.简单的实例项目&#xff1a;2.原理分析&#xff1a;3.浅谈使用SSM框架化&#xff1a; 1.简单的实例项目&#xff1a; how2j 2.原理分析&#xff1a; 具体见流程图…

MySQL-1-基础

MySQL 简介 mysql-server #提供服务 mysql-client #提供SQL命令 官网地址&#xff1a;https://dev.mysql.com/downloads/ https://downloads.mysql.com/archives/community/查看帮助文档 mysql> ? contents一、安装MySQL 1.1、二进制安装mysql5.7-linux 安装前准备 sh…

SpringBoot 的创建和使用

Spring Boot 的优点 Spring的出现是为了简化 Java 程序开发,而 SpringBoot 的出现是为了简化 Spring 程序开发. SpringBoot 就是 Spring脚手架 快速集成框架&#xff0c;Spring Boot提供了启动添加依赖的功能&#xff0c;用于秒级集成各种框架。内置运行容器&#xff0c;无需配…

python+vue大学新生入学报道交流平台pycharm

本系统的用户可分学生、教师、管理员三类。 管理员模块 1)登录&#xff1a;管理员输入用户名、密码&#xff1b;选择“管理员”角色&#xff1b;点击登录按钮。 2)管理员主界面&#xff1a;以管理员身份登录成功后&#xff0c;选择进入网站系统管理模块&#xff1b;选择进入首页…

Python字符串类型的使用

文章目录 Python中的字符串类型一、字符串的常用操作二、字符串的常用函数 Python中的字符串类型 注意&#xff1a;字符串为不可修改类型 python中没有单独的字符类型&#xff0c;字符就是长度为1的字符串。 通常创建字符串的方式&#xff1a;一般用单引号&#xff08;’ &am…