STL初识——string类的那点事

Posted 風的尾巴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL初识——string类的那点事相关的知识,希望对你有一定的参考价值。

何为STL?
STL是指标准模板库(Standard Template Library)。 包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。从根本上说,STL 是一些容器、算法和其他一些组件的集合
那对于我们又应该如何去学STL呢?
养成阅读相关文档的良好习惯,下面为友友们提供两个不错的网站(记得做好克服自己的英文阅读困难的准备哦!):

cplusplus,非官网,但布局比较美观,支持到C++11
cppreference,官网,可支持到最新标准,但布局不太美观
文档一般结构布局为:接口函数声明——>接口函数的功能、参数以及返回值的说明——>使用样例代码

那让我们正式进入string类的学习吧!

首先,在STL中的string类有9个构造函数,此处以最常用的3个和大家一起来学习

  1. string类的无参构造函数
  2. string类的有参构造函数
  3. string类的拷贝构造函数
string s1;             //无参构造 
string s2("come on");  //带参的构造
string s3(s2)          //拷贝构造
string s4="come on";
s1 = "happy";   
//等价于带参数的构造,string支持char类型字符串的构造

运行结果
拓展小知识:
1.wchar_t 为宽字节,2byte 其能够更好的表示unicode等编码,其对应STL中的wsting,而常见的为char对应的sting
2.ascll码其实是早起针对英文的编码,而后来为了显示各个国家的语言文字,便引入了unicode,utf-8,uft-16,uft-32等编码,
gbk即是专门针对中文的编码方式。

接下来,让我们通过一道简单的练习再进一步理解一下吧!

原题链接
解题思路:
方法一,下标+[ ]遍历并+计数排序思想

class Solution 
public:
    int firstUniqChar(string s) 
        int count[26]=0;
        for(size_t i=0;i<s.size();++i)
        
            count[s[i]-'a']++;
        
        for(size_t i=0;i<s.size();++i)
        
            if(count[s[i]-'a']==1)
                return i; 
        
        return -1;

    
;

方法二,迭代器遍历+计数排序思想

class Solution 
public:
    int firstUniqChar(string s) 
        int count[26]=0;
        string::iterator it=s.begin();
        while(it!=s.end())
        
            count[*it-'a']++;
            ++it;
        
        for(size_t i=0;i<s.size();++i)
        
            if(count[s[i]-'a']==1)
            return i;
        
        return -1;
    
;

方法三,范围for遍历+计数排序思想

class Solution 
public:
    int firstUniqChar(string s) 
        int count[26]=0;
        for(auto x: s)
        
            count[x-'a']++;
        
        for(size_t i=0;i<s.size();++i)
        
            if(count[s[i]-'a']==1)
                return i;
        
        return -1;
    
;
总结一下,其实三种方法唯一的区别就是三种的遍历方法不同,思路的中都是计数排序的思想。

想了解三种遍历方式的详细情况吗?点击这里吧!

最后让我们再来看一下一些其他常用的接口吧

string.erase()用法

  1. string.erase(pos,n)删除从pos开始的n个字符(pos是string类型的迭代器)
    默认pos=0,n=nps=-1
  2. string.erase(pos)删除pos处的字符
  3. string.erase(first,last)删除从first到last中间的字符
string s1;
s1.erase(0,1);
s1.erase();    //为全部删完

尾插

1.push_back(’ ')插入单个字符
2.append(" ")插入字符串,也可进行拷贝构造
3.直接使用+=,可直接插入单个字符,也可以插入字符串

string s1;
s1.push_back('i');
s1.append("world");
string s2;
s2.append(s1);
s1+="rh";           //其实底层调用的还是前两个接口
s1+='l';

头插或中间插入

string.insert()
注意不支持插入单个字符,但可以插入一个字符的字符串

string s1;
s1.insert(0,"x");     //头插
s1,insert(3,"yyyy");  //中间插

虽可以进行头插和中间插,但尽量少用insert,因为底层实现的是数组,头插或者中间插入是需要挪动数据的。

以上是关于STL初识——string类的那点事的主要内容,如果未能解决你的问题,请参考以下文章

TODO:字节的那点事Go篇

重载delete时的那点事

Java反射-你不得不知道的那点事

python与中文的那点事

STL空间配置器那点事

this的那点事