C++ STL序列式容器之一 string

Hello!!大家早上中午晚上好!!今天开始关于C++STL六大组件部分内容复习!!!

一、string

1.1string的出现时间
string严格来说不属于STL容器,因为string的出现早于STL,这里一起把它归并到序列式容器中去,好一起理解!
1.2序列式容器

所谓序列式容器是以线性方式存储元素的容器,序列式容器不对存储的元素进行排序,元素的顺序与它们存储的顺序相同,常见的序列式容器有:string、vector、list、deque

1.3string的理解
string是管理字符串的类,string对字符数组进行管理,string是对字符数组进行增删查改,string是把算法作用在字符串数组上;

二、string的使用

string的构造函数

2.1string();

string的默认构造函数,作用构造一个空串:

cpp 复制代码
int main()
{
	string s1;
	return 0;
}

监视窗口可以看到,s1是一个空串,有效元素为0;

2.2string(const string&str);

string的拷贝构造函数,作用用一个string对象拷贝构造生成一个新的string对象;

cpp 复制代码
int main()
{
	//string s1;
	string s1("hello world!!");
	string s2(s1);
	return 0;
}

监视窗口可以看到s1拷贝构造s2后,s2里存储的内容跟s1的一摸一样;

2.3string(const string&str,size_t pos,size_t len=npos);

作用用string对象里的pos位置往后的len个元素拷贝构造生成一个新对象;

注意:pos为数组下标,如果不写len的个数,默认是从pos位置开始拷贝到\0之前的字符串;

cpp 复制代码
int main()
{
	//string s1;
	string s1("hello world!!");
	//string s2(s1);
	string s2(s1, 5, 7);
	string s3(s1, 1);
	return 0;
}
2.4string(const char* s);

作用用一个字符指针指向的内容拷贝构造生成一个新的string对象;

cpp 复制代码
int main()
{
	const char* ch1 = "hello world!!";
	char ch2[10] = { 'h','e','l','l','o' };
	//char ch2[] = { 'h','e','l','l','o' };//报错
	string s1(ch1);
	string s2(ch2);
	return 0;
}

注意:字符串指针指向的内容必须要有\0作为结束标识符,不然会报错!

2.5 string(const char*s,size_t n);

作用用字符指针指向的内容的前n个字符拷贝构造生成一个新的string对象;

cpp 复制代码
int main()
{
	const char* ch1 = "hello world!!";
	string s1(ch1,5);
	return 0;
}
2.6 string(size_t n,char c);

作用用n个字符构造生成一个新的string对象;

cpp 复制代码
int main()
{
	const char* ch1 = "hello world!!";
	string s1(6, 'x');
	return 0;
}
2.7template <class InputIterator>
string(InputIterator first,InputIterator last);

作用用一个迭代器区间拷贝构造生成一个新的string对象;

cpp 复制代码
int main()
{
	char ch[20] = { "hello world!!!!" };
	string s1(ch, ch+10);
	return 0;
}

三、string 的赋值运算符重载函数

3.1 string&operator=(const string&str);

作用把一个已存在的string对象赋值给另一个已存在的string对象;

cpp 复制代码
int main()
{
	char ch[20] = { "hello world!!!!" };
	string s1(ch, ch+10);
	string s2("welcome!!");
	s1 = s2;
	return 0;
}

赋值前:

赋值后:

3.2 string&operator(const char*s);

作用 把一个字符指针指向的内容赋值给一个已存在的string对象;

cpp 复制代码
int main()
{
	const char* ch1 = "hello world!!!";
	string s1 = "welcome!!";
	s1 = ch1;
	return 0;
}

赋值前:

赋值后:

3.3 string&operator=(char c);

作用 用一个字符赋值给一个已存在的string对象;

cpp 复制代码
int main()
{
	//const char* ch1 = "hello world!!!";
	//string s1 = "welcome!!";
	//s1 = ch1;
	char c = 'Y';
	string s1("XXXXXX");
	s1 = c;
	return 0;
}

赋值前:

赋值后:

四、capacity(数据存储的相关接口)

4.1 查看有效存储数据个数
cpp 复制代码
int main()
{
	string s1("helloworld!!!");
	cout << s1.size() << endl;
	return 0;
}

计算的是\0之前的字符个数;

4.2查看存储字符串的空间大小
cpp 复制代码
int main()
{
	string s1("helloworld!!!");
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	return 0;
}

字符串的有效数据个数为13,存储字符串的空间大小为15;

4.3开空间并初始化

void resize(size_t n);作用:开n个开空间大小并用'\0'初始化:

cpp 复制代码
int main()
{
	string s1;
	s1.resize(30);
	return 0;
}

resize前:

resize后:

void size(size_t n,char c); 作用:开空间并用字符初始化:

cpp 复制代码
int main()
{
	string s1;
	//s1.resize(30);
	s1.resize(20, 'x');
	return 0;
}

resize前:

resize后:

resize和capacity的关系:

我们看到当resize 30时capacity的大小为31,当resize 20时capacity的大小也为31;

4.4开空间不初始化
cpp 复制代码
int main()
{
	string s1;
	//s1.resize(30);
	//s1.resize(32);
	s1.reserve(30);
	return 0;
}

reserve前:

reserve后:

可以看出resize和reserve的区别,resize开空间的同时初始化内存空间;reserve单存开空间不会对内存空间初始化;

4.5对string对象判空操作

作用 当string对象为空串时返回false,当string对象不为空串时返回true;

cpp 复制代码
int main()
{
	string s1;
	//s1.resize(30);
	//s1.resize(32);
	string s2("hello world!!!");
	if (s1.empty())
	{
		s1 += "hello world!!!";
	}
    if (!s2.empty())
	{
		s2 += "welcome!!!";
	}
	cout << s1 << endl;
	cout << s2 << endl;
	return 0;
}
4.6清空字符串操作

作用 对字符串的数据清空变成空串;

cpp 复制代码
int main()
{
	string s1("hello world!!!");
	cout << s1 << endl;
	s1.clear();
	cout << s1 << endl;
	return 0;
}

clear前:

clear后:

五、element access(元素访问相关接口)

5.1 对string对象下标访问操作
cpp 复制代码
int main()
{
	string s1("hello world!!!");
	cout << s1[2] << endl;
	return 0;
}

operator[]有两个版本,当对象是普通对象时可以对对象里的字符串进行访问和修改;

cpp 复制代码
int main()
{
	string s1("hello world!!!");//普通对象时
	s1[2] = 'e';
	cout << s1[2] << endl;
	return 0;
}

当对象是const对象是只能对其进行访问操作;

cpp 复制代码
int main()
{
	//string s1("hello world!!!");
	const string s1("hello world!!!");//const 对象时
	s1[2] = 'e';//编译报错
	cout << s1[2] << endl;
	return 0;
}
5.2对最后/最前的一个字符的访问操作

普通对象可对最后一个字符进行访问和修改操作;

cpp 复制代码
int main()
{
	string s1("hello world X");
	s1.back() = 'Y';
	cout << s1 << endl;
	return 0;
}

对const对象只能访问;

cpp 复制代码
int main()
{
	const string s1("hello world X");
	s1.back() = 'Y';//报错
	cout << s1 << endl;
	return 0;
}

跟back的操作类似;

cpp 复制代码
int main()
{
	string s1("hello world X");//普通对象
	s1.front() = 'Y';
	cout << s1 << endl;
	return 0;
}
cpp 复制代码
int main()
{
	const string s1("hello world X");//const对象
	s1.front() = 'Y';//报错
	cout << s1 << endl;
	return 0;
}

六、modifiers(修改)

6.1字符串加等操作

string& operator+=(const string&str);

作用 一个string对象加等给另一个字符串对象;

cpp 复制代码
int main()
{
	string s1;
	s1 += "hello";
	cout << s1 << endl;
	string s2("world");
	s1 += s2;
	cout << s1 << endl;
	return 0;
}

string& operator+=(const char*s);

作用 把字符指针指向的内容+=给一个string对象;

cpp 复制代码
int main()
{
	//string s1;
	//s1 += "hello";
	//cout << s1 << endl;
	//string s2("world");
	//s1 += s2;
	//cout << s1 << endl;
	const char* ch1 = "world";
	string s1("hello");
	s1 += ch1;
	cout << s1 << endl;
	return 0;
}

string& operator+=(char c);

作用 把一个字符加等到一个string对象里;

cpp 复制代码
int main()
{
	char c = 'X';
	string s1("YYYYYYYYY");
	s1 += c;
	cout << s1 << endl;
	return 0;
}

---------------------------------------------------------------------------------------------------------------------------------string& operator+=(initializer_list<char> il);

作用 把一个initializer_list<char> 的列表初始化的数组加等给string 对象;

cpp 复制代码
int main()
{
	string s1("hello");
	initializer_list<char> il = { 'w','o','r','l','d','!' };
	s1 += il;
	cout << s1 << endl;
	return 0;
}
6.2字符串尾插操作

作用 把一个字符尾插到string对象中;

cpp 复制代码
int main()
{
	string s1("hello");
	s1.push_back('Y');
	cout << s1 << endl;
	return 0;
}
6.3字符串的删除操作

string& erase(size_t pos =0,size_t len= npos);

作用 删除pos位置往后的 len个字符;

cpp 复制代码
int main()
{
	string s1("hellXXXo");
	s1.erase(4, 3);
	cout << s1 << endl;
	return 0;
}

iterator erase (const_iterator p);

作用 删除迭代器 p所指向的元素;

cpp 复制代码
int main()
{
	string s1("hellXXXo");
	string::iterator it = s1.end();
	s1.erase(it-1);
	cout << s1 << endl;
	return 0;
}

iterator erase(const_iterator first,const_iterator last);

作用 删除迭代器区间 first到last之间的元素;返回last位置的迭代器;

cpp 复制代码
int main()
{
	string s1("hellXXXo");
	string::iterator it = s1.begin();
	string::iterator it2=s1.erase(it + 4, it + 7);
	cout << s1 << endl;
	cout << *it2 << endl;
	return 0;
}

今天就复习到这里,如果您有所收获记得点赞收藏+关注哦!!谢谢!!!

咱下期见!!!

相关推荐
曦月逸霜2 分钟前
第十四次CCF-CSP认证(含C++源码)
数据结构·c++·学习·算法
xxjiaz5 分钟前
蓝桥每日打卡--区间移位
java·数据结构·算法·蓝桥杯
kiwixing10 分钟前
Oracle ASM 磁盘组冗余策略
java·linux·运维·数据库·c++·python·oracle
hjxu201622 分钟前
【conda activate无效】 conda: error: argument COMMAND: invalid choice: ‘activate‘
linux·运维·windows
重生成为码农‍27 分钟前
类加载机制
java·开发语言·jvm
(❁´◡`❁)Jimmy(❁´◡`❁)30 分钟前
1204. 【高精度练习】密码
c++·算法
八股文领域大手子30 分钟前
Redis Lua脚本实现令牌桶限流算法
java·数据库·redis·算法·junit·mybatis·lua
Ai 编码助手35 分钟前
PHP与Python无缝融合,开启跨语言开发新纪元
开发语言·python·php
19岁开始学习37 分钟前
PHP之依赖注入
android·开发语言·php
niuTaylor37 分钟前
嵌入式硬件工程师从小白到入门-速通版(一)
linux·c语言·嵌入式硬件