记录_20210326

#include <iostream>
#include <string>
#include <vector>
#include <cstring>

using namespace std;

//手写strcmp
int string_compare(char const *f,char const *s);

int binarySearch(vector<int>,int);

void forInitailArray();

struct Foo{ /**/ };//定义结构体,最后必须有“;”

void getLine(){
    string line;
    while(getline(cin,line))
        if(!line.empty() && line.size() > 3) //line不为空,且长度大于3才输出
            cout << "input: " << line << endl;
}

int main()
{

//    Ctrl+Shift+C + X
//    int val1 = 10;
//    int val2 = 20;
//    auto item = val1+val2;
//    cout << "item: " << item << endl;
//===========================================================
//    const int i = 42;   //整形常量
//    auto j = i; //整形 int
//    const auto &k = i;  //const int 引用
//    auto *p = &i;   //指针
//    const auto j2 = i,&k2 = i;  //j2--const int,k2 -- int引用
//
//    cout << "j: " << j << endl;
//    cout << "k: " << k << endl;
//    cout << "p: " << p << endl;
//    cout << "j2: " << j2 << endl;
//    cout << "k2: " << k2 << endl;
//===========================================================

//    const int ci = 0, &cj = ci;  //ci是常整形,cj是常量引用
//    decltype(ci) x = 1; //x的类型是const int
////    x = 1; //错误:证实x为const int
//    cout << "x: " << x << endl;
//
//    decltype(cj) y = x; //y的类型是const int &,y绑定到变量x
//    cout << "y: " << y << endl;
////    decltype(cj) z; //错误:z是一个引用,必须初始化
//
//    int i1 = 42,*p = &i1,&r1 = i1;  //p是指向i1的指针,ri是i1的引用
//    decltype(r1+0) b1; //正确,类比 int b;
////    decltype(*p) c1; //错误:解引用指针可以得到指针锁指的对象,而且还能给这个对象赋值。因此,decltype(*p)的结果类型是 int &,而非int。
//
//    //decltype的表达式如果是加上括号的变量,结果将是引用
//    int i2 = 10;
//    decltype((i2)) d1 = i2; //错误:d1是int&,即引用类型,必须初始化
//    decltype(i2) d2;   //正确:d2是int

//===========================================================

    string s1(10,'a'); //直接初始化为10个'a'的字符串
    cout << "s1: " << s1 << endl;

    /*
        s2: 是"拷贝初始化",编译器会吧等号右面的初始值拷贝纸s2
        s3: 是"直接初始化"
    */
    string s2 = "hello";
    string s3("hello");

/*
*    os<<s           |  将S写到输出流os当中,返回os
*    is>>s           |  从is中读取字符串赋给s,字符串以空白符分割,返回is
*    getline(is,s)   |  从is中读取一行赋给s,返回is
*    s.empty()       |  s为空返回true,否则false
*    s.size()        |  返回字符的个数
*    s[n]            |  返回s中第n个字符的引用,位置n从0记起
*    s1+s2           |  返回s1和s2连接后的结果
*    s1=s2           |  返回s2的副本代替s1的原来的字符
*    s1==s2          |  判断字符串是否相等,对字母大小写敏感
*    s1!=s2          |  同上
*    <,<=,>,>=       |  利用字符在字典的顺序进行比较,且对字母大小写敏感
*/

/*     isalnum(c)  |   当c是字母或数字时为真
 *     isalpha(c)  |   当c是字母为真
 *     iscntrl(c)  |   当c是空值字符时为真
 *     isdigit(c)  |   当c时数字为真
 *     isgraph(c)  |   当c不是空格但可打印时为真
 *     islower(c)  |   当c是小写字母为真
 *     isprint(c)  |   当c是可打印字符为真(即c是空格或具有可视形式)
 *     ispunct(c)  |   当c是标点符号为真(即c不是控制字符、数字、字母、可打印空白中的一种)
 *     isspace(c)  |   当c是空白为真(即空格,制表符、回车、换行、进纸符中的一种)
 *     isupper(c)  |   当c是大写字母为真
 *     isxdigit(c) |   当c是16进制为真
 *     tolower(c)  |   转成小写
 *     toupper(c)  |   转成大写
 */

//    getLine(); //循环获取cin输入的值,读取一整行
//===========================================================

//    string s4("Hello Xiaomi 11pro!");
//    for (auto ss01 : s4)
//        cout << ss01 << " ";
//
//    cout << endl;
//
//    decltype(s4.size()) punct_cnt = 0;
//    //统计s4中的标点符号数量
//    for(auto ss02 : s4)
//        if(ispunct(ss02))   //判断是否是标点符号
//            ++ punct_cnt;
//
//    cout << punct_cnt
//         << " punctuation characters in " << s4 << endl;
//
//    for(auto &c : s4)         //对于s4的每个字符(注意:c是引用)
//            c = toupper(c);
//
//    cout << s4 << endl;
//===========================================================

//    const string hexdigits = "0123456789ABCDEF";    //可能的16进制数字
//    cout << "Enter a series of numbers between 0 and 15"
//         << " separated by spaces.Hit ENTER when finished: "
//         << endl;
//    string result;  //用于保存16进制的字符串
//    string::size_type n;    //用于保存输入流读取的数。
//
//    while(cin >> n)
//        if(n < hexdigits.size())    //忽略无效输入
//            result += hexdigits[n]; //得到对应的16进制数字
//
//    cout << "Your hex number is : " << result << endl;
//===========================================================

    //标准库类型vector -- 集合
    //#include <vector>

/*     vector<T> v1                |       v1是一个空vector
 *     vector<T> v2(v1)            |       v2包含v1所有元素的副本
 *     vector<T> v3 = v1           |       同上
 *     vector<T> v4(n)             |       v4包含n个重复的值
 *     vector<T> v5{a,b,c,d...}    |       v5包含了初始个数的元素,每个元素被初始化值为a,b,c...
 *     vector<T> v6={a,b,c...}     |       同上
 */


//    vector<int> ivec;   //初始状态为空
//    vector<int> ivec2(ivec);
//    vector<string> ivec3 = ivec;    //报错,不能用int初始化string对象

    //初始化列表初始化vector
//    vector<string> articles = {"a","b","c"};
////    vector<string> articles1 = ("a","b","c");   //错误,小括号错了
//    vector<int> ivec3(10,-1);  //10个元素,每个元素初始化为-1
//    vector<string> svec(10,"hi");  //10个元素,每个元素初始化为"hi"
//
//    vector<int> ivec4(10);   //10个元素,每个元素初始化为0
//    vector<string> svec1(10);   //10个元素,每个元素初始化为空字符串
//
//    vector<string> svec2(10,"null");
//
//    ivec.push_back(19);
//    cout << ivec.size() << endl;
//
//    string word;
//    vector<string> text;    //空vector对象,存储输入的字符
//    cout << "please input,if you want to exit,just use \"exit\"" << endl;
//    while( cin >> word ){
//        if(word == "exit")
//            break;
//        text.push_back(word);
//    }


/*     v.empty()       |   为空则为真,否则假
 *     v.size()        |   返回v中元素的个数
 *     v.push_back(t)  |   向尾部添加元素t
 *     v[n]            |   返回v中第n个位置上元素的引用
 *     v1 = v2         |   用v2中的元素的拷贝替换v1中的元素
 *     v1 = {a,b,c...} |   用列表中元素的拷贝替换v1中的元素
 *     v1 == v2        |   判断v1和v2是否相等
 *     v1 != v2        |   判断不相等
 *     <,<=,>,>=       |   比较
 */

    //访问vector对象中的元素
//    cout << "output is:" << endl;
//    for(auto &i : text)
//        cout << i << " ";
//    cout << endl;


//===========================================================
    //迭代器iterator
//    auto b = v.begin(), e = v.end();    //b代表第一个元素,e代表最后一个元素的下一位置
//    *iterator   -->     返回迭代器iter所指向元素的引用

//    string si("hello liusai!");
//    if(si.begin() != si.end()){
//        auto it = si.begin();
//        *it = toupper(*it); //将首字母变成大写
//    }
//
//    cout << si << endl;

    string si1("HELLO HERE IS THE MI 11 ULTRA!");
//    for(auto it = si1.begin(); it != si1.end() && !isspace(*it); ++it)  //isspace(c)--判断空格
    for(auto it = si1.begin(); it != si1.end() ; ++it)
        *it = tolower(*it);
    cout << si1 << endl;


/*     迭代器类型
 *     vector<int>::iterator it;           //1.it能读写vector<int>元素
 *     string::iterator its;               //2.its能读写string中的元素
 *
 *     vector<int>::const_iterator it1;    //3.vector<int>元素只能读,不能写
 *     string::const_iterator its;         //4.string只能读,不能写
 */

    //计算得到最接近vector中间元素的一个迭代器
//    auto mid = v.begin() + v.size() / 2;    //迭代器取中间值

    //二分查找搜索
//    vector<int> vbs{3,4,7,8};
//    int a = binarySearch(vbs,8);
//    cout << "a: " << a << endl;
//===========================================================
    //指针和数组
    int arr[] = {0,1,2,3,4,5,6,7,8,9};
    int *e = &arr[10];  //指向arr尾元素的下一个位置的指针--这种方式极易出错,不推荐使用

    //c++11新标准有两个函数可以代替,begin和end
    int *arrbegin = begin(arr);
    int *arrend = end(arr);
    for(arrbegin;arrbegin != arrend;++arrbegin)
         cout << *arrbegin << endl;
//    for(int *b = arr;b != e;++b)
//        cout << *b << endl;

    int *pa = arr;
    cout << "pa+1: " << *(pa+1) << endl;
    cout << "arr+1: "<< *(arr+1) << endl;
//===========================================================

/*     //c风格字符串的函数
 *     strlen(p)       |   返回p的长度,空格不计算在内
 *     strcmp(p1,p2)   |   比较p1和p2的相等性。若相等返回0,;p1>p2,返回正值;p1<p2,返回负数
 *     strcat(p1,p2)   |   将p2附加到p1之后,返回p1
 *     strcpy(p1,p2)   |   将p2拷贝给p1,返回p1
 */
//    char ca[] = {'C','+','+'};  //不以空字符\0结束
//    cout << strlen(ca) << endl; //严重错误:ca没有以\0字符结束

    const char sii1[] = "A Hello shanghai!";
    const char sii2[] = "A Hello shangHAI!";

    if( strcmp(sii1,sii2) > 0)
        cout << "S1 > S2" << endl;

    char largestring[100] = {}; //定义一个100个字符的空数组
    strcpy(largestring,sii1);
    strcat(largestring," -- ");
    strcat(largestring,sii2);

    cout << "largestring: " << largestring << endl;

//===========================================================

//    const char ca[] = {'h','e','l','l','o','\0'};
//    const char *cp = ca;
//    while(*cp != '\0'){
//        cout << *cp << endl;
//        ++cp;
//    }

//===========================================================

    string scs1 = "laoyang";
//    char *str = scs1;   //错误:不能用string对象初始化char*
    const char *str = scs1.c_str(); //c_str()函数的返回值是一个C风格的字符串
    cout << str << endl;

//===========================================================

    //使用数组初始化vector对象
    int int_arr[] = {0,1,2,3,4,5};
    vector<int> ivecarr(begin(int_arr),end(int_arr));
    for(auto ia : int_arr)
        cout << ia << " ";
    cout << endl;

    forInitailArray();
//===========================================================
    int iaa[3][4];      //二维数组,数组名iaa实际上是指向第一个内层数组的指针
    int (*pi)[4] = iaa;  //pi是指向含有4个整数的数组
    pi = &iaa[2];        //pi指向iaa的最后一层的4个元素

    int *pi1[4];        //定义:4个整形指针的数组
    int (*pi2)[4];      //定义:4个整数的数组

//===========================================================
    //命名的强制类型转换
/*     cast-name<type>(expression);
 *     cast-name:
 *     1.static_cast
 *     2.dynamic_cast
 *     3.const_cast
 *     4.reinterpret_cast   通常为运算对象的位模式提供较低层次上的重新解释。
 */
    int i,j;
    double d;

    // 1. int强制转换成double类型
    double slope = static_cast<double>(j)/i;

    void * p = &d;  //任何非常量对象的地址都能存入void*
    double *dp = static_cast<double *>(p);  //将void * 转换为初始的指针类型

    // 2.去const性质,这样*p就能去写内容
    const char *pc;
    char * p1 = const_cast<char *>(pc);

//    char * p2 = static_cast<char *>(pc);    //错误:static_cast不能换成const性质
    static_cast<string> (pc);   //正确:字符串字面值转成string类型
//    const_cast<string> (pc);    //错误:const_cast只改变常量属性

    // 3.reinterpret_cast 非常危险
    int *ip;    //真实对象是int,而非字符
    char * pc1 = reinterpret_cast<char*>(ip);   //将int转换成了字符指针类型
    //这样初始化非常危险
    string str1(pc1);   //再初始化string
//===========================================================
//===========================================================
//===========================================================

    return 0;
}

void forInitailArray(){

    constexpr size_t rowCnt = 3,colCnt = 4;
    int ia[rowCnt][colCnt];
    //普通for处理多维数组
//    for(size_t i = 0;i != rowCnt;++i){
//        for(size_t j = 0; j != colCnt; ++j){
//            ia[i][j] = i*colCnt + j;
//        }
//    }

    size_t cnt = 0;
    //范围for处理多维数组
    for(auto &row : ia){
        for(auto &col : row){
            col = cnt;
            ++cnt;
        }
    }

    cout << "=======================" << endl;

    //1.通过范围for遍历
//    for(const auto &row : ia)
//        for(auto col : row)
//            cout << col << endl;
    //2.通过范围for+指针遍历
//    for(auto p = ia;p != ia+3;++p){
//        for(auto q = *p;q != *p + 4; ++q){
//            cout << *q << ' ';
//        }
//        cout << endl;
//    }
    //3.通过范围for+指针+标准库函数
    //p指向ia的第一个数组
    for(auto p = begin(ia); p != end(ia); ++p)
        //q指向内层数组的首元素
        for(auto q = begin(*p); q != end(*p); ++q)
            cout << *q << ' ';
    cout << endl;
}

int binarySearch(vector<int> ivec,int sought){

    auto beg = ivec.begin(), end = ivec.end();  //定义头尾
    auto mid = ivec.begin() + (end - beg) / 2;  //中间点

    while(mid != end && *mid != sought){
        if(sought < *mid)   //前部分
            end = mid;
        else
            beg = mid + 1;  //在mid之后
        mid = beg + (end - beg)/2;  //新中间点
    }
    return *mid;
}

int string_compare(char const *first,char const *second)
{
	while(*first==*second)
	{
		if(*first=='\0')
			return 0;

			first++;
			second++;

	}
	if(*first>*second)
		return 1;
	if(*first<*second)
		return -1;
}


值传递和地址传递的解析

https://www.bilibili.com/video/BV1et411b73Z?p=62

int *p[4]int (*p)[4]的区别

  1. int *p[4] --> 存指针的大小为4的数组
  2. int (*p)[4] --> 存int数的大小为4的数组
posted @ 2021-03-26 17:29  方罗良  阅读(69)  评论(0)    收藏  举报