string容器——STL

string

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

  • 跟char* 的区别:

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

  • 下标从0开始

  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开始,看后面3个拷贝给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) //全部关掉

查找

  • int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找
  • int find(const char* s, int pos = 0) const; //查找s第一次出现位置,从pos开始查找
  • int find(const char* s, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置
  • int find(const char c, int pos = 0) const; //查找字符c第一次出现位置
  • int rfind(const string& str, int pos = npos) const; //查找str最后一次位置,从pos开始查找
  • int rfind(const char* s, int pos = npos) const; //查找s最后一次出现位置,从pos开始查找
  • int rfind(const char* s, int pos, int n) const; //从pos查找s的前n个字符最后一次位置
  • int rfind(const char c, int pos = 0) const; //查找字符c最后一次出现位置
  • string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str
  • string& replace(int pos, int n,const char* s); //替换从pos开始的n个字符为字符串s

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

查找子串

string substr(int pos = 0, int n = npos) const; //返回由pos开始的n个字符组成的字符串

举例:

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>());

字符串拼接

实现在字符串末尾拼接字符串

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值