STL总结之string

介绍

string 是一个封装字符串的容器。
string 定义于头文件 <string> 中,其声明如下:

template< 
    class CharT, 
    class Traits = std::char_traits<CharT>, 
    class Allocator = std::allocator<CharT>
> class basic_string; 

// basic_string 为字符串的基础类
// string 则是 basic_string 的一个特例
typedef basic_string<char> string;

初始化

  • string s;
    创建一个空的 string 容器。
    string s;
    
  • string s(num,char);
    创建一个 string 容器,该字符串由 num 个 char 构成。
    string s(2,'c');
    // 字符串为:"ccccc"
    
  • string s(str);
    创建一个 string 字符串,该字符串等于 str。
    string s("hello");
    // 字符串为:"hello"
    
  • string s(begin_iterator,end_iterator);
    创建一个 string 字符串,该字符串由迭代器区间 [begin_iterator,end_iterator) 组成。
    string s1("hello");
    string s(s1.begin(),s1.end());
    

输入/输出

  • operator>>
    重载输入流操作符,快速实现输入一个字符串 (字符串不能含有空格、tab、换行)。
    string str;
    cin >> str;
    // 如果输入 "hello world",字符串为:"hello"
    
  • operator<<
    重载输出流操作符,快速实现输出字符串。
    string str("hello world");
    // 输出结果为:"hello world"
    
  • getline(ostream,s)
    实现读取一行字符。
    string str;
    getline(cin,str);
    

修改

string 容器中访问元素,有以下几种方式:

  1. operator[index]
    返回索引位置 index 所指元素的引用。不对访问越界进行检查。
    cout << s[0] << endl;
    
  2. at(index)
    返回索引位置 index 所指元素的引用。如果访问越界,则抛出异常。
    cout << s.at(0) << endl;
    
  3. data()
    返回 string 底层数组的指针。
    char* str = s.data();
    
  4. c_str()
    返回 string 底层数组的指针,不可修改字符串中元素。

以上 1,2,3 方式都可实现修改操作。

另有一个比较好的方法,可实现赋值操作。

  • operator=
    重载等号运算符,可快速实现赋值操作。
    string str("hello");
    str = "world";
    

查询

  • empty()
    判断 string 容器是否为空。
  • size()/length()
    返回 string 容器中元素个数。
  • capacity()
    返回 string 容器当前已分配空间的元素数。
  • max_size()
    返回 string 容器大小的理论极限值,即当前内存情况下,允许创建 string 容器中元素个数的最大可能值。
  • find(str,pos,count)
    在 [pos,pos + count) 下标范围内,查找字符串 str 第一次出现的位置,如果存在,则返回下标,否则返回 string:npos
    第三个参数可省略,查询范围至字符串尾。
    第二个、第三个参数同时省略,查询范围为整个字符串。

在 [pos,pos + count) 下标范围内查询,这种表述不明确。
应该表述为在 [pos,pos + count + str.size())中,查看是否存在 str 字符串,如果存在则返回 str 字符串第一个字符出现的位置下标。

string s("hello");
int index = s.find("ll"); // index = 2
  • rfind(str,pos,count)
    在(pos-count,pos] 下标范围内,从后向前查找字符串 str 第一次出现的位置,如果存在,则返回下标,否则返回 string:npos
    第三个参数可省略,查询范围至字符串首。
    第二个参数、第三个参数同时省略,查询范围为整个字符串。

    在 (pos-count,pos] 下标范围内查询,这种表述不明确。

应该表述为在 [pos-count,pos + str.size())中,查看是否存在 str 字符串,如果存在则返回 str 字符串第一个字符出现的位置下标。

string str("This is a string");
int index = str.rfind("is",2,1); // index = 2

比较

  • 按照字典序列比较 string 中的值。
    • operator==
    • operator!=
    • operator<
    • operator>
    • operator<=
    • operator>=
  • compare(str1)
    返回比较 str 和 str1 的结果。

增加

  • operator+ / operator+=
    重载运算符,快速实现增加元素。
    string str("hello");
    str = str + "world";
    str += "world";
    // 字符串为:"helloworld"
    
  • append(str1,pos,count)
    将 str1 字符串下标范围为 [pos,pos+count)的字符添加到 string 容器尾部。
    第三个参数可省略,添加范围至字符串尾。
    第二个参数、第三个参数同时省略,添加范围为整个字符串。
    string str("hello");
    string str1("hello");
    str.append(str1,0,4);
    // str 字符串为:"hellohell"
    
  • push_back(char)
    string 容器尾部添加一个字符 char。
  • insert(pos,num,char)
    string 容器 pos 位置添加 num 个 char 字符。
    string str("hello");
    str.insert(0,2,'h');
    // 字符串为:"hhhello"
    
  • insert(pos,str1,pos_str,num)
    string 容器 pos 位置添加一个字符串,该字符串由 str1 中下标区间为 [pos_str,pos_str + num) 中的元素组成。
    string str("hello");
    string str1("hello");
    str.insert(0,str1,0,2);
    // str 字符串为:"hehello"
    

删除

  • clear()
    清空 string 容器。
  • pop_back()
    移除 string 容器末尾字符。
  • erase(pos,num)
    移除 string 容器 pos 位置开始的 num 个字符。

其他操作

  • replace(pos,num,str2,pos_2,num_2)
    替换 string 容器中 pos 位置开始的 num 个字符,将其替换为 str2 中 pos_2 开始的 num_2 个字符。
    其中 pos_2 和 num_2 两个参数可以省略,替换范围为整个字符串。
    num_2 参数可以省略,替换范围为至字符串 str 尾。
    string str("hello");
    string str1("jj");
    str.replace(2,2,str1,0,2); 
    // str 字符串为:"hejjo"
    
  • substr(pos,num)
    返回 string 容器下标范围为 [pos,pos + num) 的子串。
  • stoi() / stol()
    字符串和数字之间的转换函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值