什么是STL
是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
STL的六大组件
为什么要学习string类
C语言中的字符串
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
标准库中的string类
1.字符串是表示字符序列的类
2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性
3. string类是使用char
(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)
4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits 和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)
5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作
总结:
1. string是表示字符串的字符串类
2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作
3. string在底层实际是:basic_string模板类的别名,typedef basic_string string
4. 不能操作多字节或者变长字符的序列。 在使用string类时,必须包含#include头文件以及using namespace std。
题目
LCR 192. 把字符串转换成整数 (atoi) - 力扣(LeetCode)
class Solution {
public:
int myAtoi(string str)
{
int res = 0, bindry = INT_MAX / 10;
int i = 0, sign = 1, length = str.size();
if(length == 0) return 0;
while(str[i] == ' ')
if(++i == length) return 0;
if(str[i] == '-') sign = -1;
if(str[i] == '-' || str[i] == '+') i++;
for(int j = i; j < length; j++) {
if(str[j] < '0' || str[j] > '9') break;
if(res > bindry || res == bindry && str[j] > '7')
return sign == 1 ? INT_MAX : INT_MIN;
res = res * 10 + (str[j] - '0');
}
return sign * res;
}
};
415. 字符串相加 - 力扣(LeetCode)
两个数字位数不同怎么处理,这里我们统一在指针当前下标处于负数的时候返回 0,等价于对位数较短的数字进行了补零操作。
class Solution {
public:
string addStrings(string num1, string num2)
{
int i = num1.length() - 1, j = num2.length() - 1, add = 0;
string ans = "";
while (i >= 0 || j >= 0 || add != 0) {
int x = i >= 0 ? num1[i] - '0' : 0;
int y = j >= 0 ? num2[j] - '0' : 0;
int result = x + y + add;
ans.push_back('0' + result % 10);
add = result / 10;
i -= 1;
j -= 1;
}
// 计算完以后的答案需要翻转过来
reverse(ans.begin(), ans.end());
return ans;
}
};
. - 力扣(LeetCode)
方法一:
class Solution {
public:
// 定义一个公开的成员函数isPalindrome,接受一个string类型的参数s,返回一个bool值
bool isPalindrome(string s) {
// 定义一个空字符串sgood,用于存放经过处理后的s的有效字符(即去除非字母数字字符并转换为小写)
string sgood;
// 遍历输入字符串s中的每个字符
for (char ch: s) {
// 如果当前字符是字母或数字(使用isalnum函数判断),则将其转换为小写(使用tolower函数)并添加到sgood中
if (isalnum(ch)) {
sgood += tolower(ch);
}
}
// 使用sgood的逆序迭代器(rbegin到rend)构造一个新的字符串sgood_rev,它包含了sgood的所有字符但顺序相反
string sgood_rev(sgood.rbegin(), sgood.rend());
// 返回sgood和sgood_rev是否相等,即原字符串s是否在经过处理后可以构成一个回文字符串
return sgood == sgood_rev;
}
};
class Solution {
public:
bool isPalindrome(string s) {
int n = s.size();
int left = 0, right = n - 1;
while (left < right) {
while (left < right && !isalnum(s[left])) {
++left;
}
while (left < right && !isalnum(s[right])) {
--right;
}
if (left < right) {
if (tolower(s[left]) != tolower(s[right])) {
return false;
}
++left;
--right;
}
}
return true;
}
};
字符串最后一个单词的长度_牛客题霸_牛客网 (nowcoder.com)
#include <iostream>
using namespace std;
int main() {
string str;
while (cin >> str) {
if (cin.get() == '\n')
cout << str.size();
}
}
. - 力扣(LeetCode)
#include <iostream>
using namespace std;
int main() {
string str;
while (cin >> str) {
if (cin.get() == '\n')
cout << str.size();
}
}
541. 反转字符串 II - 力扣(LeetCode)
思路:双指针
s[i]
的字符与 s[N - 1 - i]
的字符发生了交换的规律,因此我们可以得出如下双指针的解法:
class Solution
{
public:
void reverseString(vector<char>& s)
{
int n = s.size();
for (int left = 0, right = n - 1; left < right; ++left, --right) {
swap(s[left], s[right]);
}
}
};