1、在 Leetcode 做题时,便想顺道总结下 string 的一些用法,免得忘了。
2、博主用的是线上网页来运行 C++ 代码,感兴趣的朋友可以用,挺简洁的。
https://ideone.com/
3、遇到感兴趣的 string 用法,本文相应增加修改。
1、常用格式:
// 默认截取从 0 到 npos.
// 重载原型为string substr(_off = 0,_count = npos);
// npos 一般表示为 string 类中不存在的位置, _off表示字符串的开始位置,_count截取的字符的数目
substr()
// 设字符串长度为 n,从字符串下标为 3 开始,向后截取到下标 n - 1 为止
substr(3)
// 从字符串下标为 0 开始,向后截取 x 位
substr(0, x)
2、演示代码
#include
#include
using namespace std;
int main()
{
string str="Welcome to my blog";
cout<
1、常用方式:
// 用于获取字符串的长度,可用 str.size();
string str = "welcome";
cout<< str.size() <size() <
2、演示
1、用 sort 、reverse 排序
sort(first_pointer, first_pointer + n, cmp)
// 该函数可以给数组,或者链表list、向量排序。
// 参数1:数组的首地址,一般写上数组名就可以,因为数组名是一个指针常量。
// 参数2:首地址加上数组的长度 n(代表尾地址的下一地址)。
// 参数3:默认不填按数组升序排序。
2、上代码
#include
#include
#include
using namespace std;
int main()
{
string str = "welcome";
sort(str.begin(), str.end()); // 头文件记得加上 #include
cout<< str.c_str() <
3、演示
4、还有一种方法,参考了 C++ string数组字符串排序 sort
#include
#include
#include
#include
using namespace std;
void sort_string(string *in_array, int n, string *out_array)
{
vector strArray;
int i, j = 0;
for (int i = 0; i < n; i++)
{
strArray.push_back(in_array[i]);
// push_back 函数将一个新的元素加到vector的最后面,位置为当前最后一个元素的下一个元素
}
sort(strArray.begin(), strArray.end()); // 正序
vector::iterator st;
// string字符串对象的迭代器iterator实现其中之一的格式(正向迭代器):
// 容器类名::iterator 迭代器名;
for (st = strArray.begin(); st != strArray.end(); st++)
{
//cout << *st << endl; //打印结果
out_array[j++] = *st;
}
}
int main()
{
//string str[4] = {"Welcome", "to", "my", "blog"};
string str[5];
int i = 0;
while(cin >> str[i++]){
if(i == 4) break;
}
string str_out[4];
sort_string(str, 4, str_out);
for (int j = 0; j < 4; j++)
cout << str_out[j] << ' ';
}
// 输出:
// Success #stdin #stdout 0s 5696KB
// blog my to welcome
5、Leetcode,翻转字符串里的单词,下面是一位大佬写的解法,感兴趣的朋友可以点下面链接去了解
https://leetcode-cn.com/problems/reverse-words-in-a-string/solution/fan-zhuan-zi-fu-chuan-li-de-dan-ci-by-leetcode-sol/
#include
#include
#include
using namespace std;
int main ()
{
string s("Welcome to my blog");
reverse(s.begin(), s.end());
int n = s.size();
int idx = 0;
for (int start = 0; start < n; ++start) {
if (s[start] != ' ') {
if (idx != 0) s[idx++] = ' '; // 填一个空白字符然后将idx移动到下一个单词的开头位置
int end = start;
while (end < n && s[end] != ' ') s[idx++] = s[end++]; // 循环遍历至单词的末尾
reverse(s.begin() + idx - (end - start), s.begin() + idx); // 反转整个单词
start = end; // 更新start,去找下一个单词
}
}
s.erase(s.begin() + idx, s.end());
for(int i = 0 ; i < s.size(); i++){
if(s[i] == ' '){ cout<<' '; }
else{ cout<< s[i]; }
}
}
1、上代码
#include
#include
using namespace std;
int main ()
{
string str ("Welcome to my blog");
string str1 ("Welcome to my blog my friends.");
string str2 ("I'm reading an book.");
cout<<"size: "<< str2.size() <
2、演示
1、上代码
#include
#include
#include
#include
#include
using namespace std;
int main()
{
string str = "welcome to my blog";
//第一种方法:利用 stringstream 流来处理
string temp;
stringstream output;
output << str; // 以空格为分隔符,读取 str 字符串到 output 中
string res[4];
int i = 0;
while (output >> temp){
res[i++] = temp;
}
for (int i = 0; i < 4; i++) {
cout << res[i] << "***";
}
/* 还可以用向量来存储,力扣上总是喜欢用vector:
vector result;
output << str;
while (output >> temp)
result.push_back(temp);
for (int i = 0; i < result.size(); i++) {
cout << result[i] << ",";
}
*/
//第二种方法:利用 strtok 函数,但分割的数组类型是 char
char ch[] = "welcome to my blog";
const char *temp = " ";
char *res1;
res1 = strtok(ch, temp); //原型: char *strtok(char *str, const char *delim);
while(res){
cout<< res1 <
2、演示
3、力扣 (LeetCode) 题:https://leetcode-cn.com/leetbook/read/array-and-string/c8su7/
反转字符串中的单词 III
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。示例:
输入:"Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"提示:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。
根据这题,再利用#include
#include
#include
#include
#include
#include
using namespace std;
int main()
{
string str = "Let's take LeetCode contest";
string temp;
stringstream output;
vector result;
output << str;
while (output >> temp)
result.push_back(temp);
for (int i = 0; i < result.size(); i++) {
reverse(result[i].begin(), result[i].end());
}
for (int i = 0; i < result.size(); i++) {
cout << result[i] << " ";
}
return 0;
}
附上这题大神的解法:
class Solution {
public:
string reverseWords(string s) {
int l = 0,r;
char temp;
for(int i=0; i < s.size(); i++){
if(s[i+1] == ' '|| i + 1 == s.size()){
r = i;
while(r > l){
temp = s[r];
s[r] = s[l];
s[l] = temp;
r--;
l++;
}
l = i + 2;
}
}
return s;
}
};
string 的用法永不止上述,大家可学习参考下面的网址,博主在这里就不一一列举了。
cplusplus: string
C++中的String的常用函数用法总结
C++ 中string数组怎么求长度(元素个数)
C++迭代器一:string字符串对象的迭代器iterator实现、实现vector容器的迭代器