IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> string容器——STL -> 正文阅读

[C++知识库]string容器——STL

string

string是专门的字符串操作的一个类

  • 跟char* 的区别:

    1. char* 就是指向字符数组地址的指针,系统提供了一个string.h,这个头文件声明了很多字符串操作函数,strlen strcat strcmp strcpy…
    2. string 是一个类, 这个类将以上的内容封装到一起,使得字符串的操作更灵活,方式更多,管理更合理
    3. string这个类使用的时候不用考虑内存的分配与释放,也不用担心越界崩溃,因为前辈在封装string的时候,已经把几乎所有情况都考虑到并处理了
  • 使用string一定要添加头文件:<string>,注意区分string.h,是C语言操做字符串操作头文件

    1. 无参数的构造函数,直接输出,直接
string str  ;
cout << str ;
  1. 有参数的: string( size_type length, char ch )
string str2(6,'r');
cout<< str2 ;
输出6个r
string str2("ajbdjg");
cout<< str2 ;
输出ajbdjg 
  1. empty(),判断字符串是否为空,空返回true, 非空返回false
string str  ;
cout << str.empty() ;
就会输出0,表示空
  1. 拷贝构造:string(const string& str);
	string str2("abcdefg");
	cout << str2 << endl;

表示将str2的下标2开始,看后面三个拷贝给str4
	string str4(str2, 2, 3);
	cout << str4 << endl;

将str2全部拷贝给str5
	string str5(str2);
	cout << str5 << endl;

属性

容量

  • capacity()
    当我们申请一个字符串的时候,当长度不超过15的时候,会给你15个容量,当超过15个,会在15个容量的基础上,增加16个,只有额度不够就会增加16N个
string str1(5, 'a');
查看str1的容量
cout << str1.capacity() << endl;
容量为15

Visual Studio2019,少于15个,申请15个容量(至少申请15个),以后多余容量就增加16个大小
VC++6.0 是至少申请31个空间,以后每次增加32个

  • 修改容量:reserve()

容量的修改,不能变小,只能变大,当把容量变为18的时候,最终为31(15+16N)

  • length():字符串长度
  • size():字符个数
  • resize():重新设置字符个数

当对一个长度为8的字符串,重设字符长度为3,字符串会仅保留前三个字符,length(),size()都会被设为2,容量依然为15


输出

	string str2("abcdefg");
	cout << str2 << endl;
str2是一个对象,虽然输出str2能输出字符串,但是str2不是一个字符串
能输出字符串是应为str2的类里面重载了输出
  • 函数c_str()返回字符串空间首地址
	string str2("abcdefg");
	cout << str2.c_str() << endl;
  • 用下标[ ]可返回字符串的第几个数
	cout << str2[1] << endl;
  • at( ) 返回指定位置字符的引用
	string str2("abcdefg");
	str2.at(3);
	返回d

如果at的下标越界,会抛出异常


修改

修改指定元素

  • 下标运算[ ]
  • at()
	string str2("abcdefg");
	
	str2[2] = 's';
	str2.at(3) = 'q';

中间插入

关键词:insert

  • index位置插入str
basic_string &insert( size_type index, const basic_string &str );
  • index位置插入一个字符串
basic_string &insert( size_type index, const char *str );
  • 在index1的位置插入另一个对象的某一段
basic_string &insert( size_type index1, const basic_string &str, size_type index2, size_type num );
  • 插入前几个
basic_string &insert( size_type index, const char *str, size_type num );
  • 插入num个ch
basic_string &insert( size_type index, size_type num, char ch );

举例:

string str2("abcdefg");
str2.insert(str2.length(), 3, 'b');

尾插(拼接)

关键词:append
符号:+=

语法和中间插入相同

  • 尾巴通过一个对象拼接
basic_string &append( const basic_string &str );
  • 尾巴通过一个字符串拼接
basic_string &append( const char *str );
  • 拼接一个字对象的某一段
basic_string &append( const basic_string &str, size_type index, size_type len );
  • 拼接字符串前几个
basic_string &append( const char *str, size_type num );
  • 拼接num个字符ch
basic_string &append( size_type num, char ch );

举例:

	string str2("abcdefg");
	string str3("abcdef");
	
	str2 += str3;

	str2 += "qweqwe";
	
	str2.append(2, 'w');

重新赋值

关键词:assign
语法和中间插入相同

  • 以str赋值
basic_string &assign( const basic_string &str );
  • 以字符串赋值
basic_string &assign( const char *str );
  • 中间几个赋值
basic_string &assign( const basic_string &str, size_type index, size_type len );
  • 字符串前一个赋值
basic_string &assign( const char *str, size_type num );
  • num个ch赋值
basic_string &assign( size_type num, char ch );

举例:

	string str2("abcdefg");
	string str3("abcdef");

	str2 = str3;
	cin >> str2;
	
	str2.assign("qweer", 2);

	str2.erase(0, str2.length());
	cout << str2 << endl;

删除

关键词:erase

  • 删除指定位置开始的指定个数
basic_string &erase( size_type index = 0, size_type num = npos );
  • 全部清理
erase(0, str2.length());

比较

a > b 返回 1,a < b 返回-1,a == b 返回0

关键词:compare

	string str2("aabrweq");
	string str3("abr");

	cout << (str2 <= str3) << endl;  //重载比较运算符, 结果是真和假
	
	cout << str2.compare("asd") << endl;

复制

关键词:copy

将对象中的某一段复制进一个字符数组中

size_type copy( char *str, size_type num, size_type index );

举例:从str2中下标为3的位置向后复制5个字符到arrStr中

str2.copy(arrStr, 3, 5);

#pragma warning(disable:4996) //全部关掉

查找子串

从指定index位置开始查找str,,找到就返回起始位置
size_type find( const basic_string &str, size_type index );

从指定位置查找一个字符串
size_type find( const char *str, size_type index );

从指定位置开始查找字符
size_type find( char ch, size_type index );

找到返回下标的位置,找不到返回-1

举例:

string str1("abcdefg");
string str2("abc")

从str1下标为0的位置查找str2
cout << str1.find(str2,0)
结果返回0,下标为0的位置

交换

关键词:swap

交换str2

	str2.swap(str3);

string迭代器

迭代器是连接容器和算法的中间键,每一个容器都有一个自己的迭代器

  • 关键词:iterator

定义一个string的迭代器

string::iterator 迭代器名;
  • 迭代器就相当于一个指向string对象元素的指针,本质上相当于 一个char* 的指针
	string str("abcdefg");

	string::iterator ite;  //相当于 char char*   

	ite = str.begin(); //字符串开头是begin(),结尾是end()
	//上面就相当于 char* a = str.c_str();  .c_str()就是字符串的开头

end()返回的是我们的迭代器最后元素的下一个位置

迭代器用的函数和char*所用的函数不一样

  • 通过迭代器来遍历字符串
	string str("abcdefg");
	ite = str.begin(); 
	
for (ite; ite != str.end(); ite++)
	{
		cout << *ite << " ";
		ite++ ;
	}

和char*的使用方法一样还可以自加

还可以通过下标运算的方式运算

	for (size_t i = 0; i < str.size(); i++)
	{
		cout << *ite << " ";
		ite++;
	}
  • 通过迭代器给指定元素赋值

通过指针赋值

都赋值为a
for (ite = str.begin();ite != str.end(); ite++)
{
	*ite = ‘a’;
}

通过下标赋值

for (size_t i = 0;i < str.size(); i++)
{
	ite[i] = 'a';
}
  • 所以可以看出来,这个迭代器定义方法跟指针不一样,用法跟指针一样

定义了一个指向 string 对象的元素的指针为什么不定义成char*呢, 因为我们这个迭代器是要跟算法连接的,它适用于所有的容器,即一个通用类型的指针,或者类似叫智能指针

  • 迭代器失效
    string重新申请空间的时候,迭代器会失效
	string str("abcdefg");
	string::iterator ite; 
	ite = str.begin(); 
	
	str.append(15, 'a');
原来str是15个控件,然后又追加15个元素,容量不够,需要从新申请空间,这时,ite迭代器会失效
	ite[4] = 'w';
	
要从新赋一下值
	ite = str.begin(); 

迭代器失效与否,与是否申请了新的控件有关,例如数组往里面增加了 过多的东西,就会失效,但是链表不会失效

string算法

for_each(循环)

循环输出字符串

  • 需要添加头文件:#include

用for_each输出一个字符串

fun函数的参数类型就是元素的类型
int fun(char c)
{
	cout << c;
	return 0;
}

string str("qweasdzxc");
for_each(str.begin(), str.end(), fun);

也可以用一个for循环带起

	string str("abcdefg");
	string::iterator ite; 

	ite = str.begin(); 

	for (ite; ite != str.end(); ite++)
	{
		cout << *ite << " " ;
	}

sort(排序)

两个参数排序,将str排序,默认从小到大排序

string str("qweasdzxc");
sort(str.begin(), str.end()); //默认从小到大(会按英文字符顺序排列)

for_each(str.begin(), str.end(), fun);

int fun(char c)
{
	cout << c;
	return 0;
}

三个参数排序,可以是字符串从大到小排列

string str("qweasdzxc");
sort(str.begin(), str.end(), greater<char>());
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:11:57  更:2022-04-24 09:12:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:19:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码