STL的六大组件:
C 库函数 - tolower()
C 标准库 - <ctype.h> C 标准库 - <ctype.h>
描述
C 库函数 int tolower(int c) 把给定的字母转换为小写字母。
C++ 标准库-< cctype >
库函数isalnum()
功能:判断一个字符是否是字母或者(十进制)数字,若为字母或者数字,则返回True(非0值),否者返回False(0)
string
构造,
三种遍历方式:
- 下标+[] 也可此方法修改,因为是引用(&)
- 迭代器 因为list map不支持[]遍历,因此迭代器是统一的一种方式 [begin(), end() ) begin就是第一个数据,而end返回的是最后一个数据的下一个位置 迭代器也可以改数据
- 范围for 依次取容器中的数据赋值给e,自动判断结束。范围for不能修改数据的,想改变得+引用&
push_back只尾插一个字符 ,append尾插一段字符也可以用迭代器描述一段区间插入数据。
+=也就是尾插,+=字符、字符串、对象都可以。
insert 是在任意位置插入也就可以完成头插。
resize(n, ‘x’)给对象中插入n个x数据,如果不给x就会插入0,resize的目标是让size变成20,如果本来就有元素,只会给后面补齐size为20个剩下的x。
reserve() 预留空间,也就是设置capacity的大小。
reverse() 逆置,
c_str()会导致如果遇见\0之后还有数据会输出不了,会返回c类型的字符串的指针。
find 找到第一次出现需要查找的字符的下标,找不见返回-1,也可以设置开始查找的位置。
rfind是从后往前找第一次出现的字符。
substr(pos, len)表示截取字符串从pos位置开始的len长度个字符。不给len就是从pos开始截取到最后 。
// string constructor
#include <iostream>
#include <string>
using namespace std;
int main()
{// 构造std::string s0("Initial string");std::string s1; //nullptrstd::string s2("A character sequence"); //A character sequence //from c-string std::string s3(10, 'x'); //xxxxxxxxxx //fill std::string s4(s0); //Initial string //copy std::string s5 = "hello"; //hello //from c-string // 三种遍历方式//1.下标+[] 也可此方法修改,因为是引用(&)for(int i=0; i<s2.size(); ++i){cout << s2[i] << endl;}//2.迭代器 因为list map不支持[]遍历,因此迭代器是统一的一种方式// [begin(), end() ) begin就是第一个数据,而end返回的是最后一个数据的下一个位置,因此不能等于string::iterator it = s2.begin();while(it != s2.end()){cout << *it << " ";it++;)//迭代器也可以改数据it = s0.begin();while(it != s0.end()) // 把*it内容也就是s0的内容全部改成a{*it = a;it++;)// 反向迭代器 rit++的时候是倒着走的,反向输出,从后往前输出string::reverse_iterator rit = s2.rbegin();while(rit != s2.rend()){cout << *rit << " ";rit++;}//3. 范围for 依次取容器中的数据赋值给e,自动判断结束for(auto e : s2) // for(auto& e : s2) 有引用可以修改{cout << e << " ";}//push_back只尾插一个字符 append尾插一段字符,也可以用迭代器描述一段区间插入数据。s2.push_back('g');s2.append("ggg");s2.append(s3.begin(), s3.end()); //也可以用迭代器描述一段区间插入数据。// +=也就是尾插,+=字符、字符串、对象都可以s2 += ' ';s2 += "ggg";s2 += s3;//insert 是在任意位置插入 也就可以完成头插s2.insert(0, "x");s2.insert(0, "tt");// resize()s1.resize(20) // 20个0 size是20s1.resize(20, 'x'); //20个xs5.resize(20, 'x'); // 给s5补齐size为20,用x补齐。s5.resize(5); //让s5只有size为5个,变成hellos//reserves1.reserve(40); //开至少够40个空间的大小//c_strcout << s0 << endl; //调用string::operator<<(cout, s1) 重载函数cout << s0.c_str() << endl; //operator<<(cout, const char*) //find 找到第一次出现需要查找的字符的下标,找不见返回-1size_t pos = s5.find('l'); //返回2size_t pos = s0.find('t', 8); //找t 但是从第8个位置开始找 找到的就是后面那个t//substr(pos, len)表示截取字符串从pos位置开始的len长度个字符。不给len就是从pos开始截取到最后string suff = s5.substr(pos); //llo//rfind是从后往前找第一次出现的字符size_t rpos = s5.rfind('l');string suff1 = s5.substr(pos); //打印的是lo
}
题目:字符串中的第一个唯一字符
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
示例 1:
输入: s = “leetcode”
输出: 0
示例 2
输入: s = “loveleetcode”
输出: 2
示例 3:
输入: s = “aabb”
输出: -1
class Solution {
public:int firstUniqChar(string s) {int countArr[26] = {0};int i = 0;while(i < s.size()){countArr[s[i] - 'a']++;i++;}int j = 0;while(j < s.size()){if(countArr[s[j] - 'a'] == 1)return j;j++;}return -1;}
};
题目:仅仅反转字母
给你一个字符串 s ,根据下述规则反转字符串:
所有非英文字母保留在原有位置。
所有英文字母(小写或大写)位置反转。
返回反转后的 s 。
示例 1:
输入:s = “ab-cd”
输出:“dc-ba”
示例 2:
输入:s = “a-bC-dEf-ghIj”
输出:“j-Ih-gfE-dCba”
示例 3:
输入:s = “Test1ng-Leet=code-Q!”
输出:“Qedo1ct-eeLg=ntse-T!”
bool IsLetter(char c)
{if(c>='a' && c<='z' || c>='A' && c<='Z')return true;elsereturn false;
}
string reverseOnlyLetters(string s) {if(s == "")return s;size_t begin = 0, end = s.size()-1;while(begin < end){while(begin < end && !IsLetter(s[begin]))++begin;while(begin < end && !IsLetter(s[end]))--end;swap(s[begin], s[end]);begin++;end--;}return s;
}
题目:字符串最后一个单词的长度
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000。
输出描述:
输出一个整数,表示输入字符串最后一个单词的长度。
getline(cin, s)是string类中,获取一行的方法,不会被空格断开。
#include <iostream>
#include <string>
using namespace std;
int main() {string s;getline(cin, s);size_t pos = s.rfind(' ');cout << s.size()-(pos+1);return 0;
}
题目:验证回文串
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
示例 1:
输入: s = “A man, a plan, a canal: Panama” 输出:true
解释:“amanaplanacanalpanama” 是回文串。
示例 2:
输入:s = “race a car” 输出:false
解释:“raceacar” 不是回文串。
示例 3:输入:s = " " 输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 “” 。
由于空字符串正着反着读都一样,所以是回文串。
bool isPalindrome(string s) {if(s == " ")return true;string s1;string s2;for(int i = 0; i < s.size(); i++){char c = s[i];if(c>='a'&&c<='z' || c>='A'&&c<='Z'){if(c>='A'&&c<='Z'){c += ('a'-'A');}s1 += c;}else if(c>='0'&&c<='9')s1 += c;elsecontinue;}string::reverse_iterator rit2 = s.rbegin();while(rit2 != s.rend()){char c = *rit2;if(c>='a'&&c<='z' || c>='A'&&c<='Z'){if(c>='A'&&c<='Z'){c += ('a'-'A');}s2 += c;}else if(c>='0'&&c<='9')s2 += c;rit2++;}if(s1 == s2)return true;return false;
}
题目:字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = “11”, num2 = “123”
输出:“134”
示例 2:
输入:num1 = “456”, num2 = “77”
输出:“533”
示例 3:
输入:num1 = “0”, num2 = “0”
输出:“0”
string addStrings(string num1, string num2) {int end1 = num1.size()-1, end2 = num2.size()-1;string retstr;int next = 0;while(end1 >= 0 || end2 >= 0){int val1 = 0;if(end1 >= 0){val1 = num1[end1] - '0';end1--;}int val2 = 0;if(end2 >= 0){val2 = num2[end2] - '0';end2--;}int ret = val1+val2+next;if(ret > 9){ret -= 10;next = 1;}elsenext = 0;//retstr.insert(0, 1, (ret + '0')); 每次头插效率太差retstr.insert += (ret+'0');}if(next == 1)//retstr.insert(0, 1, '1');retstr.insert += '1';reverse(retstr.begin(), retstr.end());return retstr;
}