zoukankan      html  css  js  c++  java
  • 第十七章 标准库特殊设施

    17.1

    	tuple<int, int, int> t{1, 2, 3};
    	tuple<int, int, int> t1(1, 2, 3);
    

      

    17.2

    	tuple<string, vector<string>, pair<string, int>> t;
    

      

    17.4

    typedef tuple<vector<Sales_data>::size_type, vector<Sales_data>::const_iterator, vector<Sales_data>::const_iterator> tup;
    vector<tup> findBook(const vector<vector<Sales_data>> &files, const string &book)
    {
    	vector<tup> vec;
    	for (auto it = files.cebegin(); it != files.cend(); ++it) {
    		auto found = equal_range(it->cbegin(), it->cend(), book, compareIsbn);
    		if (found.first != found.second)
    			vec.push_back(make_tuple(it - files.cbegin(), found.first, found.second));
    	}
    	return vec;
    }
    

      

    17.5

    typedef pair<vector<Sales_data>::size_type, pair<vector<Sales_data>::const_iterator, vector<Sales_data>::const_iterator>> Pair;
    vector<Pair> findbook_pair(const vector<vector<Sales_data>> &files, const string &book) 
    {  
        vector<Pair> ret;  
        for (auto it = files.cbegin(); it != files.cend(); ++it)  
        {  
            auto found = equal_range(it->cbegin(), it->cend(), book, compareIsbn);  
            if (found.first != found.second)  
                ret.push_back(make_pair(it - files.cbegin(), make_pair(found.first, found.second)));  
        }  
        return ret;  
    } 
    

      

    17.6

    struct matches_struct 
    {  
        vector<Sales_data>::size_type st;  
        vector<Sales_data>::const_iterator first;  
        vector<Sales_data>::const_iterator second;  
        matches_struct(vector<Sales_data>::size_type s, vector<Sales_data>::const_iterator fi, vector<Sales_data>::const_iterator se): st(s), first(fi), second(se) {}  
    };  
    
    vector<matches_struct> findbook_struct(const vector<vector<Sales_data>> &f, const string &book)  
    {  
        vector<matches_struct> ret;  
        for (auto it = f.cbegin(); it != f.cend(); ++it)  
        {  
            auto found = equal_range(it->cbegin(), it->cend(), book, compareIsbn);  
            if (found.first != found.second)  
                ret.push_back(matches_struct(it - f.cbegin(), found.first, found.second));  
        }  
        return ret;  
    }
    

      

    17.7

    倾向于书中的版本,更简洁、灵活

    17.8

    创建的是使用Sales_data默认构造函数创建的对象

    这样的结果就是书名为空,其他数据为0

    17.9

    (a):后六位为100000,前面58位全为0

    (b):后七位为1010101,前面25位全为0

    (c):若bstr包含的字符数多于8位,bv只包含bstr的前八位;否则,bv的前几位将被置零。当然,若出现非0/1的字符,会抛出异常

    17.10

    	bitset<22> b;
    	int a[] = {1, 2, 3, 5, 8, 13, 21};
    	for (auto &i : a)
    		b.set(i);
    	cout << b << endl;
    

      

    17.11

    template <unsigned N>
    class test {
    public:
    	test() = default;
    	test(unsigned long long &u): b(u) { }
    	test(string &s): b(s) { }
    private:
    	bitset<N> b;
    };
    
    int main()
    {
    	test<10> t1;
    	test<10> t2;
    }

      

    17.12

    	void set_pos(size_t pos, bool bl = true)	//问题编号,真假解答的值 
    	{
    		b.set(pos, bl);
    	}

      

    17.13

    #include <iostream>
    #include <string>
    #include <bitset>
     
    using namespace std;
    
    template <unsigned N>
    class test {
    public:
    	test() = default;
    	test(unsigned long long &u): b(u) { }
    	test(string &s): b(s) { }
    	void set_pos(size_t pos, bool bl = true)	//问题编号,真假解答的值 
    	{
    		b.set(pos, bl);
    	}
    	int get_score(bitset<N> &b1)
    	{
    		auto bb = b ^ b1;
    		bb.flip();
    		return bb.count();
    	}
    private:
    	bitset<N> b;
    };
    
    bitset<10> set_ans()
    {
    	string s;
    	cout << "请输入标准答案:"; 
    	cin >> s;
    	bitset<10> ans(s);
    	return ans;
    }
    
    int main()  
    {  
    	bitset<10> ans = set_ans();			//正确答案 
    	test<10> t;
    	int cnt = 0, pos;
    	cout << "请输入你认为正确的位置:";
    	while (cin >> pos && cnt++ <= 10) {	
    		t.set_pos(pos);
    	}
    	cout << "正确的答题数为:" << t.get_score(ans) << endl;
    	return 0;  
    }  
    

      

    17.14

    #include <iostream>
    #include <string>
    #include <regex>
     
    using namespace std;
    
    int main()
    {
    	try {
    		regex r("[[:alnum:]+", regex::icase);
    	} catch (regex_error e) {
    		cout << e.what() << "
    code: " << e.code() << endl;
    	}
    	return 0;
    }
    

      

    17.15

    #include <iostream>
    #include <string>
    #include <regex>
     
    using namespace std;
    
    int main()
    {
    	regex r("[[:alpha:]]*[^c]ei[[:alpha:]]*", regex::icase);  
        string s;  
        cout << "Please input a word(enter 'q' to quit!): " << endl;  
        while(cin >> s && s != "q")  
        {  
            if(std::regex_match(s, r))  
                cout << s << " is okay!" << endl;  
            else  
                cout << s << " is not okay!" <<endl;  
      
            cout << "Please input a word(enter 'q' to quit!): " << endl;  
        }  
    	return 0;
    }
    

      

    17.16

    只有一个单词为三个字符时才匹配

    17.28

    vector<unsigned> func()
    {
    	vector<unsigned> vec;
    	static default_random_engine e;
        static uniform_int_distribution<unsigned> u;
    	for (auto i = 0; i != 10; ++i)
    		vec.push_back(u(e)); 
    	return vec;
    }

      

    17.29

    vector<unsigned> func(unsigned seed)
    {
    	vector<unsigned> vec;
    	static default_random_engine e(seed);
        static uniform_int_distribution<unsigned> u;
    	for (auto i = 0; i != 10; ++i)
    		vec.push_back(u(e)); 
    	return vec;
    }
    

      

    17.30

    vector<unsigned> func(unsigned seed, unsigned mmin, unsigned mmax)
    {
    	vector<unsigned> vec;
    	static default_random_engine e(seed);
        static uniform_int_distribution<unsigned> u(mmin, mmax);
    	for (auto i = 0; i != 10; ++i)
    		vec.push_back(u(e)); 
    	return vec;
    }
    

      

    17.31

    每次循环中,分布返回的总是同一个值

    17.32

    到右大括号时,resp对象将被释放

    17.33

    #include <iostream>
    #include <string>
    #include <random>
     
    using namespace std;
    
    string trans1(const string &s1, const string &s2)
    {
    	string s = s1 + s2;
    	return s;
    }
    
    string trans2(const string &s1, const string &s2)
    {
    	string s = s1;
    	return s;
    } 
    
    int main()
    {
    	default_random_engine e;
    	bernoulli_distribution b;
    	bool bl = b(e);
    	string ss;
    	if (bl)	ss = trans1("love", "kzw");
    	else	ss = trans2("love", "kzw");
    	cout << ss << endl;
    	return 0;
    }
    

      

    17.34

    #include <iostream>
    #include <string>
    #include <iomanip>
     
    using namespace std;
    
    int main()
    {
    	int i = 20;
    	double d = 10, d1 = 30.1415926;
    	bool bl = true, bp = false;
    	cout << boolalpha << bl << " " << bp << " " << noboolalpha << bl << endl;
    	cout << showbase << 20 << " " << oct << 20 << " " << hex << 20 << endl << dec << noshowbase;
    	cout << setbase(8) << 20 << " " << 20 << endl;
    	cout << showpoint << d << noshowpoint << endl;
    	cout << showpos << i << noshowpos << endl;
    	cout << d1 << " " << scientific << d1 << " " << fixed << d1 << " " << d1 << endl;
    	cout << setw(10) << d1 << " " << setprecision(7) << d1 << endl;
    	return 0;
    }
    

      

    17.35

    	cout << uppercase << hexfloat << sqrt(2.0) << endl;
    	cout << nouppercase << defaultfloat;
    

      

    17.36

    	double d0 = 3.14, d1 = 31.415, d2 = 520.1314, d3 = 11.11223344;
    	cout << "d0: " << setw(12) << d0 << " next col" << endl
    		 << "d1: " << setw(12) << d1 << " next col" << endl
    		 << "d2: " << setw(12) << d2 << " next col" << endl
    		 << "d3: " << setw(12) << d3 << " next col" << endl;
    

      

    17.37

    当未遇到分隔符时,若已读取的字符数超过了size - 1时(下面的程序就是9),就会结束循环

    但若遇到分隔符时,前面读取的字符数还未超过size - 1时,会打印该行(如空行),然后开始读取开始下一行(读取的字符数会清0)

    小结:要想读取完整,那么字符数组和size都要设置的足够大,大到每一次读取可以遇到分隔符。

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <iomanip>
    #include <cmath>
     
    using namespace std;
    
    int main()
    {
    	ifstream in("data.txt");
    	char str[100];
    	do{
    		in.getline(str, 10, '
    ');
    		cout << str << endl;
    	} while(in);
    	return 0;
    }
    

      

    17.38

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <iomanip>
    #include <cmath>
     
    using namespace std;
    
    int main()
    {
    	ifstream in("data.txt");
    	char str[100];
    	do{
    		//谨记上一题的教训,size应设置得足够大,至少大于最长的单词的长度 
    		in.getline(str, 30, ' ');		//单词应该以空格分隔 
    		cout << str << endl;
    	} while(in);
    	return 0;
    }
    

      

    17.39

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <iomanip>
    #include <cstdlib>
    #include <cmath>
     
    using namespace std;
    
    int main()
    {
    	fstream ios("data.txt", fstream::ate | fstream::in | fstream::out);
    	if (!ios) {
    		cerr << "Unable to open file!" << endl;
    		return EXIT_FAILURE;
    	}
    	auto endMark = ios.tellg();
    	ios.seekg(0, fstream::beg);
    	string line;
    	size_t cnt = 0;
    	while (ios && ios.tellg() != endMark && getline(ios, line)) {
    		cnt += line.size() + 1;
    		auto mark = ios.tellg();
    //		ifstream::pos_type mark = ios.tellg();
    		ios.seekp(0, fstream::end);
    		ios << cnt;
    		if (mark != endMark)	ios << " ";
    		ios.seekg(mark);
    	}
    	ios.seekp(0, fstream::end);
    	ios << endl;
    	return 0;
    }
    

      

  • 相关阅读:
    photoSlider-原生js移动开发轮播图、相册滑动插件
    JavaScript库开发者们的规则
    如何提高手机APP的用户体验?
    html清除浮动的6种方法
    JS内存泄露常见原因
    web前端开发规范文档
    jQuery无缝循环开源多元素动画轮播jquery.slides插件
    9种CSS3炫酷图片展开预览展示动画特效
    纯css3 transforms 3D文字翻开翻转3D开放式效果
    html5+css3第一屏滚屏动画效果
  • 原文地址:https://www.cnblogs.com/xzxl/p/7792519.html
Copyright © 2011-2022 走看看