STL——string类的使用总结

string类是表示字符序列的类,并添加了专门用于操作单字节字符串的设计

在这 述
图为string常用接口。

string的常用接口模块

  1. string的构造
  2. 容量操作
  3. 元素访问操作
  4. 元素修改操作
  5. 关于字符串特殊操作
  6. 迭代器

1.string的构造

string的4种常见的构造方式

    string()
    string(const char*)
    string(size_t , char)
    string(string)

#include <iostream>
using namespace std;
#include <string>
int main()
{
	string s1; //普通的无参构造
	string s2("hello world"); //带参构造,s2初始化
	string s3(10,'a'); //s3 为 10 个重复的字符 'a'
	string s4(s3); //s4 拷贝构造 s3
	return 0;
}



2.容量相关操作

1.size() 与capacity()

size()表示当前容器有效元素的个数 capacity()表示当前容器的总大小
string s("12345");

s.size();  //此时有效元素个数为 5
s.capacity();//此时容量为 15

s.clear(); //清空所有有效元素

s.size();  //此时有效元素个数为 0
s.capacity();//此时容量还是 15

s.clear()只清空有效字符,底层容量的大小不变


2.resize() 与reserve()

resize(n)修改当前有效元素的个数到n个
    1.如果n小于现有元素个数,则将n个后元素舍去
    2.resize(n,char c)如果n大于现有个数,则超出的部分用字符c填充

string s("12345");

s.resize(10,‘?’)//往后添加 5个? 最终的字符串为 12345?????
s.resize(3); //缩小到 3个元素   最终字符串 123

resize修改的是有效元素个数,不会修改底层容量的大小,但如果对字符串后填充操作时,如果超过当前底层容量的大小,则底层字符串容量会自动扩容1.5到2倍

reserve(n)修改底层容量的大小,不影响有效元素的个数

string s("12345");

s.reserve(20); //此时 capacity为 31

s.reserve(10); //此时 capacity为 15

reserve(),如果对容量进行扩充,修改的容量不一定与给定的容量相同,容量的改变有自己的修改机制。
如果对容量进行缩小,该函数不会执行,除非容量小于15时,返回15


3.元素访问和修改操作

1.下标访问与a()

与数组用法相同,通过[ ] 可以访问下标位置的元素 或者通过at(),访问相应位置的元素
string s("abcde")

s[1]; //访问字符 'b'
s[0] = '1'; //通过赋值修改相应下标位置的元素
s.at(2); //访问字符 'c'

二者如果访问越界都会发生异常。但异常处理不相同,下标访问越界,出发assert断言,at()访问越界,抛出out_of_range异常


2.push_back(),append()添加元素

同样都是尾插元素

push_back() 只能向后添加一个char类型字符.
append(),运算符+=,都能向后添加char,或是追加c风格的const char*字符串,以及string类型字符串。

string s1;
s1.push_back(‘I’);

s1+=" Love "; //此时s1内容为  "I Love "
string s2("you");
//s1向后追加string类字符串s2
s1+=s2; //此时s1的内容为 "I Love you"  s2还是"you"

s1.append(1,',');// 向后添加一个 字符 ','
s1.append("abc"); //向后追加c风格的字符串


追加的有效元素一旦超过当前的底层容量大小,则string类会对容量进行自动扩容,扩容机制按照大概1.5倍扩容


3.insert()插入元素

可以在指定位置插入 char类型字符, const char*字符串, string类型字符串。
string s("abcde");

s.insert(2,'0'); //在下标2后插入字符'0' s为"abc0de"

4.c_str()转换为C风格字符串

string内部c_str() 可以将当前 string类型字符串转换为C风格的 const char*字符串。
string s("12345");

//atoi函数可以将字符串中的数字转换为相同的整形
int ret = atoi(s.c_str); //使用atoi需将 string类转化为C风格字符串

5.find()和rfind()查找元素

find() 从起始位置开始找需要查找的元素,并返回查找后匹配的第一个位置

rfind()从最后的位置开始查找。如果位找到则返回npos

string s("hello world");
size_t pos = s.find(' ' );
if(pos!= string::npos)
{
	cout<<pos;//返回查找到的第一个元素
}
pos = s.find("world"); //也可以查找string类型的元素

//应用find() 寻找文件后缀  abc.txt
string s2("abcde.txt")
pos = s2.rfind('.') + 1; //pos位置后就是后缀的位置

6.substr() 截取字符串

传递两个参数,第一个参数为,从字符串哪个位置开始截取

第二个参数为,向后截取多少位,默认截取到字符串末尾

string s2("abcde.txt")
pos = s2.rfind('.') + 1; //pos位置后就是后缀的位置

string s3;
s3 = s2.substr(pos,3); //从pos位置向后截取3位,取得后缀


4.迭代器

迭代器可以当作指针理解。string::iterator

1.循环遍历string中元素的3种方法

string s("hello");

//通过for each循环
for(auto e:s)
{
	cout<<e;
}

//通过s.size()获取长度
for(int i = 0;i<s.size();i++)
{
	cout<<s[i];
}

//通过iterator迭代器
string::iterator it = s.begin(); //从s起始位置开始
while(it!=s.end())
{
	cout<<*it;
	it++;
}
发布了52 篇原创文章 · 获赞 13 · 访问量 5453

猜你喜欢

转载自blog.csdn.net/MPF1230/article/details/103977605