1 四个标准库设施
- tuple
- bitset
- 随机数生成
- 正则表达式
- IO库再探
2 tuple类型
- 类似pair模板,保存一定数量的不同成员类型的成员。
- 头文件#include
2.1定义及初始化
- 定义tuple时需要指出成员类型,由于构造函数是explicit的,必须使用直接初始化语法:
std::tuple<size_t, size_t, size_t> threeD{ 1,2,3 };
auto user = std::make_tuple("hh", 160, 90.2);
2.2访问
- tuple对象都是未命名的,要通过get函数访问tuple类型成员。计数从0开始。
auto username = std::get<0>(user);
std::cout << username << std::endl;
std::get<0>(user) = "xx";
std::cout << std::get<0>(user) << std::endl;
auto* usernamep = &(std::get<0>(user));
* usernamep = "aa";
std::cout << std::get<0>(user) << std::endl;
typedef decltype(user) userstype;
std::tuple_element<1, userstype>::type cnt = std::get<1>(user);
size_t sz = std::tuple_size<userstype>::value;
std::cout << sz << std::endl;
2.3比较
当对应运算符操作合法且两个tuple类型对象成员数量相同时,可以使用关系运算符和相等运算符进行比较操作。
2.4使用
- 通过tuple函数,可以从一个函数中返回多个值并进行处理
#include
#include
#include
#include
typedef std::tuple<std::string, size_t, double> hhtype;
class hhdy{
public:
friend class hhdyvec;
hhdy(std::string s = "", size_t count = 0,double p= 0.0):name(s),cnt(count),price(p){}
std::string getname() { return this->name; }
hhtype get_tuple() { return std::make_tuple(name, cnt, price); }
private:
std::string name;
size_t cnt;
double price;
};
class hhdyvec {
public:
friend std::vector<hhtype> get_record_of_book(std::string& s, hhdyvec& hv);
hhdyvec() {};
hhdyvec(std::vector<hhdy> v):vech(v){}
hhdyvec& push_back(hhdy h) {
vech.push_back(h);
return *this;
}
private:
std::vector<hhdy> vech;
};
std::vector<hhtype> get_record_of_book(std::string& s, hhdyvec& hv) {
std::vector<hhtype> ret;
for (hhdy h : hv.vech) {
if (h.getname() == s)
ret.push_back(h.get_tuple());
}
return ret;
}
std::ostream& print_record_of_book(std::istream& is,std::ostream& os, hhdyvec& hv) {
std::string s;
os << "输入书名: ";
is >> s;
std::vector<hhtype> ret = get_record_of_book(s, hv);
size_t st = std::tuple_size<hhtype>::value;
for (hhtype h : ret) {
os <<"bookname: "<<std::get<0>(h)
<<" count: "<<std::get<1>(h)
<<" price: "<<std::get<2>(h)
<< std::endl;
}
return os;
}
std::ostream& print_books(std::istream& is, std::ostream& os, hhdyvec& hv) {
std::string s;
do {
print_record_of_book(is, os, hv);
os << "continue ?(y/n)";
is >> s;
} while (s == "y" || s == "Y");
return os;
}
int main() {
hhdyvec hv;
hhdy h1 = hhdy("book1", 1, 10);
hhdy h2 = hhdy("book2", 2, 20);
hv.push_back(h1);
hv.push_back(h2);
hv.push_back(h2);
print_books(std::cin, std::cout, hv);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
3bitset类型
- 除内置运算符外,标准库还定义了bitset类,使位运算使用更容易。能处理超过最长整形类型大小的位集合。
- 头文件
#include
3.1定义及初始化
- 定义bitset时,要声明他用多少位,大小是一个常量表达式。
- 二进制位从0开始编号,编号从0开始称为低位,到结束为高位。
定义 | 说明 |
---|
bitset b; | n位,每位都是0,构造函数是constexpr |
bitset b(u); | u为unsigned long long类型,b是u的第n位拷贝。b超出的高位部分置0,构造函数是constexpr |
bitset b(s,pos,m,zero,one) ; | string从下标pos开始m个字符的拷贝。字符串只包含zero和one。构造函数是explicit的 |
bitsetb(cp,pos,m,zero,one); | 从cp指向的字符数组中拷贝字符。构造函数是explicit的 |
std::bitset<32> b1(0xaaaa);
std::bitset<10> b2(0xaaaa);
std::bitset<128> b3(~0ULL);
std::bitset<10> bs1("1100");
std::string s = "111000";
std::bitset<10> bs2(s,0,2);
std::bitset<10> bs3(s, 2);
std::bitset<10> bs4("22323333",6,'3','2');
string | 1 | 1 | 0 | 0 |
---|
| s[0] | s[1] | s[2] | s[3] |
bitset | 1 | 1 | 0 | 0 |
| b[3] | b[2] | b[1] | b[0] |
3.2操作
类别 | 操作 | 说明 |
---|
置位判断 | b.any() | 是否存在置位 |
| b.all() | 所有位置位为真 |
| b.none() | 所有位置不存在置位为真 |
| b.count() | 置位位数 |
| b.test(pos) | pos位置置位返回真 |
访问 | b.size() | constexpr函数,返回b位数 |
| b[pos] | 访问b中pos位置的位 |
修改 | b.set(pos,v) | 设置pos处的位值为v,v默认true |
| b.set() | 设置全部位值为v |
| b.reset(pos) | 复位 |
| b.reset() | |
| b.flip(pos) | 取反 |
| b.flip() | |
转换 | b.to_ulong() | 无法放入时会抛出异常overflow_error,UL最长32位,ULL最长64位 |
| b.to_ullong() | |
| b.to_string(zero,one) | |
打印 | os< | |
| is>>b | |
std::cout <<"bitset操作:" << std::endl;
std::bitset<64> b5(0xaaaa);
try {
auto ul = b5.to_ulong();
std::cout << ul << std::endl;
}catch (std::overflow_error err) {
std::cerr << err.what() << std::endl;
}
3.3使用
std::bitset<30> quizB;
quizB.set(27);
status = quizB[27];
quizB.reset(27);
4正则表达式
空,代补
5随机数
5.1随机数生成方法
- 新标准前,采用C库函数rand,生成均匀分布的伪随机整数(0-32767),现在应使用default_random_engine类+分布类对象。
- 新标准,使用头文件
#include
,库中包含随机数引擎类和随机数分布类,通过引擎类生成的随机数,使用分布类生成指定类型、给定范围内的、服从特定概率分布的随机数。
5.2随机数引擎与分布