飞道的博客

记:应聘深信服科技 C++工程师(南京)

348人阅读  评论(0)

笔试

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,并且只能通过 i t *it 来访问set里面的元素。(由于除开vector和string之外的STL容器都不支持 ( i t + 1 ) *(it+1) 的访问方式。)

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场