字符串相关的知识和操作:
• 字符串字面量:在 C++中,字符串字面量是用双引号括起来的字符序列,如"Hello, World!"。
• 字符串连接:可以使用+运算符或std::string::append方法来连接两个字符串。
• 字符串长度:std::string::length方法或size()方法可以返回字符串的长度。
• 字符串比较:可以使用==和!=运算符来比较两个字符串是否相等或不相等。<,>,<=,>=运算符可以用于比较字符串的字典顺序。
• 字符串查找:std::string::find方法用于查找子字符串在字符串中的位置。
• 字符串替换:std::string::replace方法可以替换字符串中的某些字符或子字符串。
• 字符串分割:可以使用std::istringstream或正则表达式来分割字符串。
• 字符串转换:除了to_string,还可以使用std::stoi,std::stol,std::stof,std::stod等函数将字符串转换为整数或浮点数。
• 字符串大小写转换:std::transform函数结合tolower或toupper函数可以用于转换字符串中字母的大小写。
• 字符串修剪:std::string::erase和std::string::find_first_not_of等方法可以用来去除字符串两端的空白字符。
• 字符串插入和删除:std::string::insert方法用于在字符串的指定位置插入字符或子字符串,std::string::erase方法用于删除指定位置的字符或子字符串。
• 字符串迭代器:可以使用迭代器遍历字符串中的每个字符,如`for (char c : str)。
• 字符串流:std::stringstream可以用来从字符串读取数据或将数据写入字符串。
to_string详解
to_string函数是 C++11 引入的一个非常实用的函数,它用于将各种数值类型转换为std::string类型。这个函数定义在<string>头文件中,因此在使用之前需要包含这个头文件。
函数原型
template <class T>
std::string to_string(T value);
这里的T可以是多种数值类型,包括但不限于:
• 整型:int,long,long long,unsigned int,unsigned long,unsigned long long等。
• 浮点型:float,double,long double。
• 枚举类型(enum)。
• 字符类型:char,wchar_t,char16_t,char32_t。
用法示例
• 转换整数为字符串:
int num = 123;
std::string str = std::to_string(num); // str == "123"
• 转换浮点数为字符串:
double pi = 3.14159;
std::string str = std::to_string(pi); // str 将包含 pi 的字符串表示,可能包含小数点后几位
• 转换枚举类型为字符串:
enum class Color { Red, Green, Blue };
Color c = Color::Green;
std::string str = std::to_string(static_cast<int>(c)); // 需要显式转换为整数类型
• 转换字符为字符串:
char ch = 'A';
std::string str = std::to_string(ch); // str == "65",字符 'A' 的 ASCII 值
• 转换布尔值为字符串:
bool flag = true;
std::string str = std::to_string(flag); // str == "1"
注意事项
• to_string函数不会保留数值的小数部分,如果需要保留小数,可以使用std::ostringstream或格式化库(如 C++20 的std::format)。
• 对于枚举类型,to_string默认不会转换为枚举的名称,而是转换为整数值。如果需要转换为枚举的名称,需要自定义转换逻辑。
• 对于布尔值,to_string会将其转换为"0"或"1",而不是"true"或"false"。如果需要转换为"true"或"false",同样需要自定义转换逻辑。
自定义转换
如果to_string不满足需求,可以自定义转换函数,例如:
或者使用std::ostringstream:
std::string floatToString(double value, int precision) {
std::ostringstream os;
os << std::fixed << std::setprecision(precision) << value;
return os.str();
}
字符串处理
std::string类提供了丰富的方法来支持各种字符串操作。
• std::string::rfind:
与find相对应,rfind从字符串的末尾开始向前搜索子字符串。
std::string str = "example";
size_t pos = str.rfind("ex"); // 返回 4,因为 "ex" 从索引 4 开始的最后一次出现
• std::string::find_first_of`和`std::string::find_first_not_of:
这两个函数分别用于查找第一个出现的任意字符(在给定的字符集合中)和第一个不出现的字符(不在给定的字符集合中)。
size_t pos = str.find_first_of("aeiou"); // 返回 1,找到第一个元音 'a'
size_t pos = str.find_first_not_of("aeiou"); // 返回 0,找到第一个非元音 'e'
• std::string::find_last_of和std::string::find_last_not_of:
这两个函数与`find_first_of和`find_first_not_of`类似,但是它们从字符串的末尾开始搜索。
• std::string::substr:用于从字符串中提取子字符串。
std::string sub = str.substr(0, 3); // 提取从索引 0 开始的 3 个字符,结果是 "exa"
• std::string::compare:用于比较两个字符串。
int result = str.compare("examp"); // 返回 0,因为 "example" 等于 "examp"
• std::string::copy:用于将字符串复制到字符数组中。
char buffer[10];
str.copy(buffer, 6); // 将 "examp" 复制到 buffer 中
• std::string::erase:用于删除字符串中的字符。
str.erase(2, 3); // 删除从索引 2 开始的 3 个字符,结果是 "exle"
• std::string::insert:
用于在字符串的指定位置插入字符或子字符串。
str.insert(2, "a"); // 在索引 2 位置插入 'a',结果是 "exaple"
• std::string::replace:
用于替换字符串中的字符或子字符串。
str.replace(2, 3, "ple"); // 替换从索引 2 开始的 3 个字符为 "ple",结果是 "eple"
• std::string::swap:
用于交换两个字符串的内容。
std::string str1 = "hello";
std::string str2 = "world";
str1.swap(str2); // 交换 str1 和 str2 的内容
• std::string::clear:
用于清空字符串。
str.clear(); // 清空 str 的内容
• std::string::resize:
用于改变字符串的长度。
str.resize(5); // 将 str 的长度改变为 5,如果原长度大于 5,则截断;否则用空字符填充
• std::string::empty:
用于检查字符串是否为空。
if (str.empty()) {
// 字符串为空
}
• std::string::push_back`和`std::string::pop_back:
用于向字符串末尾添加或移除字符。
str.push_back('!'); // 在末尾添加 '!'
str.pop_back(); // 移除末尾的字符
• std::getline:
用于从输入流中读取一行文本到字符串。
std::getline(std::cin, str); // 从标准输入读取一行到 str
• std::string::front 和 std::string::back :
分别用于访问字符串的第一个和最后一个字符。
char first = str.front(); // 获取第一个字符
char last = str.back(); // 获取最后一个字符
蓝桥杯真题:顺子日期
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
string t1="012",t2="123";
int ans=0;
for(int i=1;i<=12;i++){
for(int j=1;j<=31;j++){
s="2022";
if(i<10)s+='0'+to_string(i);
else s+=to_string(i);
if(j<10)s+='0'+to_string(j);
else s+=to_string(j);
if(s.find(t1)!=-1||s.find(t2)!=-1) ans++;
}
}
cout<<ans;
return 0;
}