笔试
1.正则表达式。
以下是自己后续的学习。
/*
环形报数。 链表,正则表达式。
考试的时候不会,今天先来学习一下正则表达式。
*/
/*
2020.3.25 11:10
学习正则表达式。来自bili视频 https://www.bilibili.com/video/BV1Cs411a7Le?p=12
*/
#include <regex>
#include <iostream>
using namespace std;
//int main() {
// string str;
// while (true) {
// cin >> str;
// //regex e("abc"); //没有任何的特殊的匹配,仅仅是匹配"abc"
// //regex e("abc."); //.表示任何字符,但不可以是空格符或是换行符。。
// //如果要求,出现在str的前面,则需要在e前面加上^ 如果出现在后面,则需要在e的后面加上$
// //例如 "^abc."则表示e需要出现在str的前面,才算是匹配成功。
// //regex e("abc.$"); //.表示任何字符,但不可以是空格符或是换行符。。
// //regex e("abc", regex_constants::icase); //后面的参数的意思是忽略大小写。可以匹配。ABC abc ABc .....
// //regex e("abc?"); //? 的作用是前面的c字符可以出现 0次或1次 。
// //regex e("abc*"); //*的作用是前面的c字符可以出现 0次或多次。
// //regex e("abc+"); //+的作用是前面的c字符出现 1次或多次。 与*相比,+限制了至少要出现1次。
// //regex e("ab[cd]"); //[]的意思是里面的字符任意出现一个。
// //regex e("ab[^cd]"); //^的作用是不在[]里面的字符。在这里就是不是c或d的一个字符。
// //但是这里只能出现一次。需要出现多次,就需要使用前面的*或+
// //regex e("ab[cd]*"); //这样就可以出现多次。
// //有时还需要它出现指定的次数。
// //regex e("ab[cd]{3,}"); //出现的次数在3次以上。
// //regex e("ab[cd]{3,5}"); //出现的次数在3-5次。
// //regex e("abc|fgde"); //|表示或。就是匹配abc 或者是fgde
// //regex e("(abc)de+\\1"); //这个可以匹配abcdeabc 那个+是起连接作用的。
// //这个东西吧,可以少些一点。。暂时不知道有啥用。。
// //下面这个是匹配一个人的邮箱的。感觉很实用。
// //regex e("[[:w:]]+@[[:w:]]+\.com"); //[[:w:]]可以表示 数字 字母 和下划线。
// //regex e("abc.+"); //这里的+表示.出现一次或多次。可以匹配abcd abcdefefefe abcfjk等。
// //如果我们想匹配+呢?
// //regex e("abc.+",regex_constants::grep); //这样就可以匹配abcr+ abcd+等。
// //bool match = regex_match(str, e);
// //bool sub_match = regex_search(str, e); //这里的这个函数只要求部分的子串和e匹配就可以了。 e出现在str的前中后都可以。
// //如果要求,出现在str的前面,则需要在e前面加上^ 如果出现在后面,则需要在e的后面加上$
// //例如 "^abc."则表示e需要出现在str的前面,才算是匹配成功。
// //cout << (match ? "matched" : "not matched") << endl;
// }
// return 0;
//}
//int main() {
// string str;
// while (true) {
// cin >> str;
// smatch m; //可以匹配出中间的那串邮箱的代码。
// regex e("([[:w:]]+)@([[:w:]]+)\.com");
// bool found = regex_search(str, m, e);
// cout << "m.size()= "<<m.size()<<endl;
// for (int i = 0; i < m.size(); i++) {
// cout << "m[" << i<<"]"<<m[i]<<endl;
// }
// //m[0]是一整串字符串。
// //m[1]之后的是部分的。 例如输入是www@cwr.com 那么m[0]是整个字符串。m[1]是www m[2]是cwr
// cout << "邮箱的前缀" << m.prefix().str() << endl; //这两个东西一个是前缀,一个是后缀。
// cout << "邮箱的后缀" << m.suffix().str() << endl; //这个东西的作用是记录除了邮箱之外的前后文。
// //例如,如果输入是<email>wee@ed.com<end> 那么前缀是<email>,后缀是<end>。
// }
// return 0;
//}
//可以说这个方法只适合很正常的 xxxx@xxx.com邮箱。不是很有通用性。。。
//我来设计一个有通用性的邮箱检测。
int main() {
string str;
while (true) {
cin >> str;
//regex e("^.+\[@\].+[\.com|\.edu\.cn]$"); //这么写倒是确实容易。。。
//但是已经几乎没有任何的检查了。。。
string pattern( "(\\w)+((-)*(\\w)*)*@(\\w)+((\\.(\\w)*)*)" );
regex e(pattern);
bool match = regex_match(str, e);
cout << (match ? "matched" : "not matched") << endl;
}
return 0;
}
//接下来是关于regex的两个迭代子。
//regex_iterator regex_token_iterator
// 大家看这个视频 https://www.bilibili.com/video/BV1Cs411a7Le?p=14
//我的脑容量今天接受不了了。
//三个推荐的网站。
//https://www.runoob.com/regexp/regexp-intro.html 菜鸟教程的。
//http://blog.guoyb.com/2016/09/10/cpp11-9/
2.STL中set的find()函数。
1.set是一个内部自动递增排序且不重复的容器。
2.定义set数组。set<int> a[100]
一个数组,数组里面的每个元素都是set<int>
3.set容器内元素的访问只能使用迭代器,例如:set<int>::iterator it;
这样就得到了迭代器it,并且只能通过
来访问set里面的元素。(由于除开vector和string之外的STL容器都不支持
的访问方式。)
set<int> it;
for(set<int>::iterator it=st.begin();it!=st.end();it++){
print("%d",*it);
}
4.set的find(value)函数返回set中对应值为value的迭代器,时间复杂度为O(log N),N为set内的元素个数。
set<int>::iterator it=st.find(2); //在st中查找2,返回其迭代器。
3.C++中string的find()函数。
str.find(str2) //当str2是str的子串时,返回其在str中第一次出现的位置;如果不是,返回string::npos.
str.find(str2,pos) //从str的pos号位置开始匹配str2,返回值与上相同。
//时间复杂度是O(nm),n和m分别是str和str2的长度。
4.关于C++的迭代器。
迭代器的出现是为了访问不同类型容器的方便。
(截图来自:bili一up主)
这是迭代器的分类:
容器会根据内部保存数据的类型,尽可能提供功能最多的迭代器。如string容器使用的是随机访问迭代器。
凉了。
转载:https://blog.csdn.net/weixin_40007143/article/details/105081377
查看评论