string
string是专门的字符串操作的一个类
-
跟char* 的区别:
- char* 就是指向字符数组地址的指针,系统提供了一个string.h,这个头文件声明了很多字符串操作函数,strlen strcat strcmp strcpy…
- string 是一个类, 这个类将以上的内容封装到一起,使得字符串的操作更灵活,方式更多,管理更合理
- string这个类使用的时候不用考虑内存的分配与释放,也不用担心越界崩溃,因为前辈在封装string的时候,已经把几乎所有情况都考虑到并处理了
-
使用string一定要添加头文件:
<string>
,注意区分string.h
,是C语言操做字符串操作头文件 -
下标从0开始
- 无参数的构造函数,直接输出,直接
string str ;
cout << str ;
- 有参数的: string( size_type length, char ch )
string str2(6,'r');
cout<< str2 ;
输出6个r
string str2("ajbdjg");
cout<< str2 ;
输出ajbdjg
- empty(),判断字符串是否为空,空返回true, 非空返回false
string str ;
cout << str.empty() ;
就会输出0,表示空
- 拷贝构造: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>());
字符串拼接
实现在字符串末尾拼接字符串