string(1),咕咕咕
1.STL简介
STL是C++标准库中重要组成部分,不仅是可复用的组件库,还是一个包罗数据结构与算法的软件架构。
有6大组件:仿函数,算法,迭代器,空间配置器,容器,配接器
推荐学习书籍《The C++ Standard Library》
2.string类
就是C++的字符串,使用string类时必须要#include头文件,using namespace std;
C++11后,auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
用auto声明指针类型时,用auto与auto*没有区别,但是auto声明引用类型时必须要加&
当在同一行声明多个变量时,这些变量类型必须是相同的类型,否则编译器会报错,因为编译器实际上对第一个类型推导,然后用推导出来的类型定义其他变量。
auto不能作为函数的参数,可以做返回值,但是建议谨慎使用,不能直接用来声明数组
//不能做参数
void gugu(auto a){}//可以做返回值
auto gugu(int a){}auto a=1;
auto b;//报错,必须由初始值设定auto aa=1,bb=1.0//推导的类型必须一致auto array[]={1,2,3};//报错,数组不能具有其中包含"auto"的元素类型std::map<std::string,std::string>::iterator it=dict.begin();
可以替换成auto it=dict.begin()
对一个有范围的集合,C++11引入了范围for循环,可以作用到数组和容器对象上遍历,实际就是迭代器在底层作用,汇编层可以看到
int array={1,2,3,4,5};
for(auto& x:array)
{
x++;
}for(auto x:array)
{
cout<<x;
}
3.string类常用接口
常见构造
string() 空字符串
string(const char* s) 用C-string构建对象
string(size_t n,char c) 对象包含n个字符c
string(const string& s) 拷贝构造函数容量操作
size 有效字符长度,一般都用size就行,包含\0
length 有效字符长度
capacity 空间总大小
empty 是否为空
clear 清空有效字符,不改变空间大小
reverse 预留空间,不改变有效元素个数,参数小于底层空间大小时不改变容量大小
resize 有效字符的个数改成n个,多出的空间用c替代(默认用0)
如果是元素个数增加,可能会改变底层容量大小,如果元素个数减少,底层空间不变访问及遍历
operator[]返回pos位置的字符,const string 类对象调用
begin()与end() 从前到后
rbegin()与rend()从后到前
范围for对象修改操作
push_back 尾插字符c
append 追加字符串
operator+=追加字符串
c_str 返回c格式的字符串
find与npos 从pos位置开始找字符c,返回该字符的位置
rfind 从pos向前找字符c,返回字符位置
substr 从pos开始,截取n个字符,返回非成员函数
operator+ 少用,传值返回,深拷贝效率低
operator>> 输入 到空格为止
operator<< 输出
getline 获取一行字符串,包含空格
relational operators 大小比较
vs下string结构
string占28个字节,内部先是有一个联合体,联合体定义string
中字符串的存储位置
当字符串长度小于16,使用内部固定的字符数组存放
大于16长度,从堆上开辟空间
还有一个size_t保存字符串长度,一个size_t保存从堆上开辟的空间总容量
最后还有一个指针做事 16+4+4+4=28字节g++
string通过写时拷贝实现,共4个字节,内部包含一个指针,
指向一块堆空间,存储字符串,内部包含:空间总大小,字符串有效长度,引用计数
4.guguuguguguguguguguguguguguugu的练习题
https://leetcode.cn/problems/first-unique-character-in-a-string/description/
class Solution {
public:int firstUniqChar(string s) {int count[26]={0};for(int i=0;i<s.size();i++){count[s[i]-'a']++;}for(int i=0;i<s.size();i++){if(count[s[i]-'a']==1)return i;}return -1;}
};
https://leetcode.cn/problems/valid-palindrome/description/
class Solution {
public:bool isPalindrome(string s) {string res1;for(auto& x:s){if(isalnum(x)){res1+=tolower(x);}}if(s.empty()) return true;string s1=res1;reverse(s1.begin(),s1.end());return res1==s1;}
};
https://www.nowcoder.com/practice/8c949ea5f36f422594b306a2300315da?tpId=37&&tqId=21224&rp=5&ru=/activity/oj&qru=/ta/huawei/question-ranking
#include <bits/stdc++.h>
using namespace std;int main() {string s;getline(cin, s);size_t last_space = s.find_last_of(' ');if (last_space == string::npos) {cout << s.size() << endl;} else {cout << s.size() - last_space - 1 << endl;}return 0;
}
https://leetcode.cn/problems/reverse-string/
class Solution {
public:void reverseString(vector<char>& s) {reverse(s.begin(),s.end());}
};
https://leetcode.cn/problems/add-strings/description/
class Solution {
public:string addStrings(string num1, string num2) {int end1=num1.size()-1;int end2=num2.size()-1;int carry=0;string gugu;while(end1>=0||end2>=0){int value1=(end1>=0)?(num1[end1--]-'0'):0;int value2=(end2>=0)?(num2[end2--]-'0'):0;int sum=value1+value2+carry;carry=sum/10;sum%=10;gugu+=(sum+'0');}if(carry) gugu+='1';reverse(gugu.begin(),gugu.end());return gugu;}
};
https://leetcode.cn/problems/multiply-strings/description/
class Solution {
public:string multiply(string num1, string num2) {if(num1=="0"||num2=="0") return "0";int n1=num1.size(),n2=num2.size();vector<int> gugu(n1+n2,0);for(int i=n1-1;i>=0;i--){int value1=num1[i]-'0';for(int j=n2-1;j>=0;j--){int value2=num2[j]-'0';int sum=gugu[i+j+1]+value1*value2;gugu[i+j+1]=sum%10;gugu[i+j]+=sum/10;}}string res;for(int x:gugu){if(!(res.empty()&&x==0))res+=x+'0';}return res;}
};
https://leetcode.cn/problems/reverse-words-in-a-string-iii/description/
class Solution {
public:string reverseWords(string s) {int l=s.size();int start=0;for(int i=0;i<=l;i++){if(i==l||s[i]==' '){reverse(s.begin()+start,s.begin()+i);start=i+1;}}return s;}
};
https://leetcode.cn/problems/reverse-string-ii/description/
class Solution {
public:string reverseStr(string s, int k) {int n=s.size();for(int start=0;start<n;start+=2*k){int end=min(start+k,n);reverse(s.begin()+start,s.begin()+end);}return s;}
};