C++ Review - Next Show
int i=0; int i={0}; int i{0}; int i(0); 函数之内初始化为0,函数之外为未定义 std::cout, cin, cerr, clog extern int i;不能初始化,常量extern可以用表达式 extern const x = i; 应用 int &ref=val; const int &r =i;不允许替代修改 int *p=nullptr; int *p=0; int &const cur = &err 一直指向err const int *const pip=π 顶层const不能改值,底层指向一个const对象 int *const cur = &err; //if err is int. However if err is const int, then reverse. err=&a; //error *err=a; //valid /* In C/C++, the type of "int *" is allowed to up qualify to the type "const int *". */ typedef char* pstring const pstring a=0; //equal to char *const a=0; //不能展开理解 constexpr编译时候知道结果,指针必须初始化为nullptr or 0 using SI=int; typedef int SI auto decltype(a) c; string s(n,'c') s.empty() s.size(); getline(is,s) s1==s2 s[n] while(cin >> word) auto len = line.size() unsigned int line.size() < 0!!!! 字面值不能相加 s1+","+"hello";//valid ","+s1//error ctype for (decl:express) for(auto c: str) for (auto &c:s) vector v(n,val); vector v(n); vector v{a,b,c} v.push_back(i); vector::size_type v.end() v.begin() *iter iter->mem while(s.begin()!=s.end()) auto it = s.begin(); vector::iterator v.begin() v.cbegin() v.empty() iter1-iter2同一容器, different_type距离可正可负 int *p = &ia[2] int k = p[-2] const char *str = s.c_str(); vector iv(begin(arr), end(arr)) 尽量用标准库而不是数组 取模 (-21)%(-5) = -5 21%(-5) = 1 cast_name(expr) double s = i/j; static_cast(i)/j switch case try catch 传引用参数,相当于直接使用,避免拷贝,返回额外信息 形参会自动忽略顶层const,所以尽量使用常量引用,会通用一些 const int &r = 42; 多维数组,第二维度之后的数组大小是数据类型不能省略 不要返回局部引用 initializer_list int *p1[10] type (*func)(params) auto func(int i) -> int(*) [10]; 默认实参 __func__函数名 __FILE__文件名 __LINE__当前行数 __TIME__ __DATE__编译日期 -D NDEBUG 重载 istringstream record(line) record >> name; vector deque//双向链表 list forward_list array //更安全 string iterator const_iterator reference const_reference value_type size_type different_type c1=c2 a.swap(b) swap(a,b) c1={a,b,c,d} c(begin,end) //不支持array c.size() c.max_size() c.empty() c.insert() c.erase(args) c.clear() rbegin(),反向迭代器+1,获得上一个元素 array a= {42} a[0]= 42,其他为0 swap比赋值拷贝快得多 array不支持吃{}和assign seq.assign(b,e) //vector和string不支持push_front c.push_back() c.insert(p,t)// insert t before p c.insert(p, n, t) c.insert(p, begin, end) //-------------\\\list c.front() c.begin() c.end() c.back()尾元素 exception auto &v = c.back()返回的是引用 c.pop_front() c.pop_back() c.erase(p) list.resize(15) c.capacity() c.reverse() s.append() s.replace(start,len, "Ff") s.substr(pos,n) s.find() s.rfind() s.find_first_of() s.find_last_of() s.find_first_not_of() s.find_last_not_of() s=to_string(int) double d= stod(s)//stoi stol stoll stoull stack/queu/priority_queue //stack s.pop() s.push() s.emplace() //queue q.front() q.back() q.push(item) // algorithm swap() find(begin, end, val)//find_if(begin, end, pred) fill copy//reverse_copy replace sort(begin(),end()) ret=unique(b,e)迭代器最后一个不重复元素的位置 find_if(b,e,lambda) lambda [capture list](parameter) -> return type { function; } auto f = []{return 42} //只有单一return不需要return type lambda不能有默认参数 可以捕获引用 [&v1]{return v1;} 尽量减少捕获数量 要对捕获的数值期望负责 [=]值,[&]引用 [=, &os](){}输出流必须引用 bind(callable, arg_list) auto g = bind(f,a,b,c-2,c)占位符-1 using std::placeholder::-1 //list 特有的 lst.merge(lst2); lst.merge(lst2,comp) lst.remove(val) lst.remove_if(pred) lst.reverse() lst.sort() lst.unique() lst.splice() map/set/unordered_map/unordered_set mapval.first mapval.second {{key,val},} pair a {"key","Val"} make_pair() p1.first, p1.second mapped_type/value_type/key_type map[x]==x不存在会创建一个,所以必须用m.find(k) 无序容器使用桶实现,每个桶保存一个或者多个元素,用一个hash_func映射到桶里 shared_ptr p1; p.get();p.swap(q)p1.empty() make_shared(42) new/ delete之后要dangling pointer,要赋值成null,和未初始化一样