记录_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]的区别
- int *p[4] --> 存指针的大小为4的数组
- int (*p)[4] --> 存int数的大小为4的数组

浙公网安备 33010602011771号