《C++ Primer》学习笔记 — 标准库特殊设施
一、bitset
bitset是一个模板类,用于处理二进制相关的运算。
1、定义和初始化
实例化模板类的参数为二进制数的长度。类实例化后可以通过unsigned long long赋值,也可以通过0、1组成的字符串进行赋值:
#include <bitset>
int main()
{
bitset<32> b32(156);
bitset<32> b32("0111100111110010101111");
}
2、bitset 操作
bitset模板中定义了多种监测或设置二进制位的方法,同时重载了位运算符(& | ~)。
#include <iostream>
#include <bitset>
#include <vector>
using namespace std;
int main()
{
bitset<32> b32(156);
cout << boolalpha
<< "b32.any() = " << b32.any() // 是否存在置位的位
<< " b32.all() = " << b32.all() // 是否全部置位
<< " b32.none() = " << b32.none() // 是否全部没有置位
<< " b32.count() = " << b32.count() // 置位的位数
<< " b32.size() = " << b32.size() // 总位数
<< noboolalpha <<endl << endl;
vector<int> vec;
for (int i = 0; i < b32.size(); i++)
{
if (b32.test(i)) // 第i位是否置位
{
vec.push_back(i);
}
}
cout << "bit with 1:" << endl;
copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "));
cout << endl << endl;
cout << "b32.to_string() = " << b32.to_string() << endl; // 转换为字符串
cout << "b32.flip().to_string() = " << b32.flip().to_string() << endl; // 所有位翻转
cout << "b32.reset().to_string() = " << b32.reset().to_string() << endl; // 所有位复位
cout << "b32.set().to_string() = " << b32.set().to_string() << endl; // 所有位置位
}
上述方法几乎都有对应的带参版本,用于设置某特定位。如 set(pos) 可用于将某位复位为1。
二、正则表达式
1、regex
regex类定义了一个正则表达式,其默认使用的正则表达式语言是ECMAScript(也就是js中定义的正则)。我们可以在构建对象时指定使用的正则语言,也可以设置匹配选项(如是否忽略大小写,是否保存匹配的子表达式等)。该类也提供了mark_count方法用于获取子表达式个数。
#include <iostream>
#include <regex>
using namespace std;
int main()
{
regex r("([[:alpha:]]*start)([[:alpha:]]*test)([[:alpha:]]*end)[[:alpha:]]*", regex_constants::extended | regex_constants::icase); // icase - 忽略大小写 extended - 使用POSIX扩展的正则语法
cout << r.mark_count() << endl;
}
[[:alpha:]] 表示任意字母。
2、reg_search
寻找第一个与正则表达式匹配的子字符串:
int main()