C++语法

C++

String 类

头文件:

#include<string>

String类的定义与初始化:

#include<iostream>
#include<string>

using namespace std;

int main(){
    string s1;//变量s1只定义为初始化,编译器给默认值空字符串""
    string s2 = "C Plus Plus";//s2在定义时同时被初始化为"C Plus Plus"。与C风格字符串不同,string的结尾没有结束标志'/0'
    string s3 = s2;//s3定义时使用s2进行初始化
    string s4(5,'s');//s4被初始化为由5个's'组成的字符串"sssss"
    return 0;
}

String类函数

函数名 解释
length() 计算字符串长度,返回字符串真实长度
c_str() 将C++风格string转换位C风格字符串,返回字符串指针
insert(pos,str) 在string字符串中指定的位置pos插入另一个字符串str.
erase(pos,len) 在string字符串中指定位置pos删除长度为len的子串。(len未指明则删除到末尾)
substr(pos,len) 在string字符串中提取从指定位置pos开始,长度为len的子串

String字符串的输入输出

string类重载了输入输出运算符,即在C++中可以使用输入输出流(<<, >>)进行输入输出.

访问字符串中的字符

string可以采用下标的方式进行访问,其起始下标依旧是从0开始的。

字符串的拼接

string类的拼接使用++=运算符来直接拼接字符串,不需要担心溢出问题。

使用+来拼接字符串,两侧可以都是string,也可以是一个string字符串,一个C风格字符串、string字符串和字符数组、string字符串和单独字符。

字符串查找

string类提供了如下几个与字符串查找有关的函数:

find()函数

find()函数用于在string字符串中查找子字符串出现的位置,有如下两种原型:

  1. find(str,pos)
  2. find(c,pos)

其中"str""c"表示待查找的子字符串或字符,"pos"表示开始查找的位置,若不指明,默认从第0个字符开始。

当找到子字符串,返回子字符串第一次出现在字符串中的起始下标,若没找到,则返回无穷大值(-1)。

rfind()函数

rfind()函数与find()函数类似,与之不同的是该函数从头开始进行查找,直到pos所指明的位置为止,查找到,返回子字符串第一次出现的起始下标,若没找到,返回无穷大值(-1)。

find_first_of()函数

find_first_of()用于查找子字符串和字符串共同具有的字符在字符串中首次出现的位置。

Set类

algorithm

max_element与min_element

该函数用于在数组或容器中寻找最大值或最小值,具体使用方法如下:

//数组
int position = max_element(a,a+n)-a;
int data = *max_element(a,a+n);
//容器
int position = max_element(v.begin(),v.end())-v.begin;
int data = *max_element(v.begin(),v.end());
//string
int position = max_element(s.begin(),s.end())-s.begin();
char data = *max_element(s.begin(),s.end());

若使用该函数检查的数组或容器有多个最值,该函数只返回第一次出现的位置。

C++正则

正则表达式

总述

正则用来匹配字符串,C++可以支持ECMAScript支持的正则(C++默认支持)以及grep支持的正则等。接下来将首先介绍ECMAScript正则,之后介绍C++中正则的使用。

ECMAScript支持的正则

正则由元字符和普通字符组成。普通字符就代表它原本的含义;元字符的意义不同于该字符本来的含义,而是有特殊的意义和功能。

根据其意义功能划分,可将元字符划分为:

具有特殊意义的元字符

\:\字符能够改变字符原本的含义

^:^字符指示字符串的头,并且要求字符串以字符开头,不占位,\^表示一个真正的^符号

$:$字符指示字符串的尾,且要求字符串以字符结尾,不占位。\$表示一个真正的$符号

、():分组,大正则中包含小正则,可以改变默认优先级。在模式中可以使用那个\1来表示第一组已然捕获到的东西

\b:指示字符串的边界(头/尾/空格左/空格右),字符\b要求边界的左边是字符,\b字符要求边界的右边是字符

.:表示处理\n之外的任意一个字符。\.表示一个真正的.符号

|:字符串1|字符串2表示一个字符串,该字符串是字符串1和字符串2中的一个。|在正则中优先级比较混乱,所以使用时需要增加括号进行分组。

[]:[字符串1字符串2字符串3……]表示一个字符,该字符是字符1、字符2、字符3……中的某一个。中括号中出现的所有字符都是代表本身含义的字符(没有特殊含义),如[.]只能匹配.符号,而不能匹配任意字符。[^字符1字符2字符3……]:表示一个字符,该字符不是字符1、字符2、字符3……中的任何一个。例如:

[a-z]:表示一个字符,该字符是a、b、c……z中的某一个

[^a-z]:表示一个字符,该字符不是a、b、c……z中的某一个。

\w:表示一个字符,该字符是数字、字母、下划线中的某一个。等价于[(0-9)(a-z)(_)(A-Z)]

\d:表示一个字符,该字符是0、1、2……9中的某一个

\D:表示一个字符,该字符不是0、1、2……9中的某一个

\s:表示一个字符,该字符是空白符(空格、制表符、换页符)

量词元字符

*:字符*要求字符出现0到多次

+:字符+要求字符出现1到多次

?:字符?要求字符出现0次或1次

{n}:字符{n}要求字符出现n次

{n,}:字符{n,}要求字符出现n次到多次

{n,m}:字符{n,m}要求字符出现n次到m次

C++支持的正则

/**在ECMAScript中写一个匹配11位电话号码的正则模式是这样的**/
var r = /\d{1,11}/;
/**在C++中写一个匹配11位电话号码的正则模式是这样写的**/
regex r("\\d{1,11}");

传递给regex构造函数的参数是一个字符串,该字符串被C++编译器解析后,将\\解析为真正的\(因为C++中的字符\是转义字符),解析出来的\和紧随其后的d组合,形成真正的\d,表示一个数字字符。

所有含有\的元字符在C++定义时需要写成\\

C++使用正则

匹配与否

头文件<regex>中的regex_matchregex_search均可以进行匹配,返回一个布尔值,匹配成功为true,匹配失败为false。

不同点:前者要求完全匹配,后者要求字串匹配;

下面以regex_match为例进行说明:

string str = "hhh2333";
regex r("[a-z0-9]+");

//用法1
bool flag = regex_match(str,r);
//用法2
bool flag = regex_match(str,regex("\\d+"));
//用法3
bool flag = regex_match(str.begin()+7,str.end(),regex("\\d+"));

替换

函数:regex_replace(str1,regex,str2);

含有:将str1中匹配到regex的部分替换成str2。

捕获

捕获的步骤
  1. 模式中一般要也有分组(捕获的是分组匹配的结果)

  2. 定义一个STL容器smatch,用来保存捕获的结果

  3. 使用regex_search函数匹配,使用smatch的实例存储匹配的结果,完成捕获

  4. 使用m.size(),查看捕获的个数;使用m.str(i),查看捕获到的字符串;

    【注意:m.str(0)一定是整个正则匹配到的部分,m.str(1)及以后才是分组捕获的结果】

  5. m.prefix().str()获取整个匹配之前的字符串;m.suffix().str()获取整个匹配之后的字符串

Vector

posted @ 2021-05-18 18:44  Frances_FKYM  阅读(102)  评论(0)    收藏  举报