cplusplus,非官网,但布局比较美观,支持到C++11
cppreference,官网,可支持到最新标准,但布局不太美观
文档一般结构布局为:接口函数声明——>接口函数的功能、参数以及返回值的说明——>使用样例代码
那让我们正式进入string类的学习吧!
首先,在STL中的string类有9个构造函数,此处以最常用的3个和大家一起来学习
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 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,因为底层实现的是数组,头插或者中间插入是需要挪动数据的。