zoukankan      html  css  js  c++  java
  • 《C++ Primer(第五版)》知识巩固

    运行平台:ubuntu 12.04/GCC 4.8.0

     

    第二章:基本内置类型

     1.decltype类型指示符

    当我们从表达式的类型来推断要定义的类型时,可以使用decltype()来解析;decltype与auto不同,decltype应用于变量,返回该变量的类型。

    	string s("Hello World!!!");
    	// punct_cnt has the same type that s.size returns
    	decltype(s.size()) punct_cnt = 0; 
    

    2.转义序列

    xxx 八进制

    x(xxx) 十六进制

    unsigned char c = -1;   // assuming 8-bit chars, c has value 255
    	i = c;  // the character with value 255 is an unprintable character
    	        // assigns value of c (i.e., 255) to an int
    	std::cout << i << std::endl; // prints 255
    
    	unsigned u = 10;
    	int i = -42;
    	std::cout << i + i << std::endl;  // prints -84
    	std::cout << u + i << std::endl;  // if 32-bit ints, prints 4294967264
    

    3.getline()的使用

    string line;
    
    	// read input a line at a time until end-of-file
    	while (getline(cin, line))
    		cout << line << endl;
    

     4.str.size()返回为string::size_type类型,这是标准库与机器无关的特性之一。

    如下面这个例子,输入大小在0-15之间的数字,求其对应的十六进制符号:

    const string hexdigits = "0123456789ABCDEF";  // possible hex digits
    
    	cout << "Enter a series of numbers between 0 and 15"
    	     << " separated by spaces.  Hit ENTER when finished: " 
    	     << endl;
    	string result;        // will hold the resulting hexify'd string
    
    	string::size_type n;  // hold numbers from the input
    	while (cin >> n)
    		if (n < hexdigits.size())    // ignore invalid input
    			result += hexdigits[n];  // fetch the indicated hex digit
    
    	cout << "Your hex number is: " << result << endl;
    

     而与之相关的则是size_t类型,size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。

    #include <cstddef>
    using std::size_t;
    
    constexpr size_t rowCnt = 3, colCnt = 4;
    	int ia[rowCnt][colCnt];   // 12 uninitialized elements 
    	
        // for each row
        for (size_t i = 0; i != rowCnt; ++i) {
            // for each column within the row
            for (size_t j = 0; j != colCnt; ++j) {
                // assign the element's positional index as its value
                ia[i][j] = i * colCnt + j;   
    		}
    	}
    

     第四章:表达式

    1.值的溢出

    思考下面运算的结果:

    short short_value = 32767; // max value if shorts are 16 bits
    
    	short_value += 1; // this calculation overflows
    	cout << "short_value: " << short_value << endl;
    

     第六章:函数

    1.返回数组指针的函数,这三种表达方式,留意:

    int *p = elemPtr(6);         // p points to an int
    	int (*arrP)[5] = arrPtr(5);  // arrP points to an array of five ints
    	int (&arrR)[5] = arrRef(4);  // arrR refers to an array of five ints
    
    / two arrays
    int odd[] = {1,3,5,7,9};
    int even[] = {0,2,4,6,8};
    
    // function that returns a pointer to an int in one of these arrays
    int *elemPtr(int i)
    {
    	// returns a pointer to the first element in one of these arrays
    	return (i % 2) ? odd : even;  
    }
    	
    // returns a pointer to an array of five int elements
    decltype(odd) *arrPtr(int i)
    {
    	return (i % 2) ? &odd : &even; // returns a pointer to the array 
    }
    
    // returns a reference to an array of five int elements
    int (&arrRef(int i))[5]
    {
    	return (i % 2) ? odd : even;
    }
    

     2.含有可变参数的函数

    在C11中提供了两种方法:如果参数类型相同,可以传递一个名为initializer_list的标准库类型;如果类型不同,可以使用可变参数模版,见16章。使用方法如下:

    // overloaded version takes only a list of strings
    void error_msg(initializer_list<string> il)
    {
    	for (auto beg = il.begin(); beg != il.end(); ++beg)
    		cout << *beg << " " ;
    	cout << endl;
    }
    
    string expected = "description", actual = "some other case";
    	initializer_list<int> li = {0,1,2,3};
    
    	// expected, actual are strings 
    	if (expected != actual)
    		error_msg({"functionX", expected, actual});
    	else
    		error_msg({"functionX", "okay"});
    

     3.函数指针

    C11中尾置返回类型,如声明如下:

    // use trailing return type
    auto getFcn(const string&) -> string::size_type(*)(const string&, const string&);
    

       而函数指针的另外两种声明定义,一种是()括号解析,另一种则是借用decltype确定返回类型为函数指针类型,使用如下:

    decltype(sumLength) *getFcn(const string &);
    
    // direct definition
    string::size_type (*getFcn(const string&))(const string&, const string&);
    
    // define getFcn
    decltype(sumLength)* 
    getFcn(const string &fetch)
    {
    	if (fetch == "sum")
    		return sumLength;
    	return largerLength;
    }
    

                                                                                                                  

  • 相关阅读:
    LeetCode Count of Range Sum
    LeetCode 158. Read N Characters Given Read4 II
    LeetCode 157. Read N Characters Given Read4
    LeetCode 317. Shortest Distance from All Buildings
    LeetCode Smallest Rectangle Enclosing Black Pixels
    LeetCode 315. Count of Smaller Numbers After Self
    LeetCode 332. Reconstruct Itinerary
    LeetCode 310. Minimum Height Trees
    LeetCode 163. Missing Ranges
    LeetCode Verify Preorder Serialization of a Binary Tree
  • 原文地址:https://www.cnblogs.com/sansan/p/3434294.html
Copyright © 2011-2022 走看看