编号 | 说明 |
1 | using 声明
头文件中一般不应该使用using声明
|
2 | 标准库类型string
#include<string> using std::string;
初始化方式: string s1; string s2(s1); string s2 = s1; string s3("value"); string s3 = "value"; string s4(n, 'c');
直接初始化 拷贝初始化 =
string对象操作: os << s is >> s getline(is, s) s.empty() s.size() s1 + s2 s1 = s2 s1 == s2 s1 != s2 <, <=, >, >=
string::size_type类型 auto len = s.size(); 在索引中也可以使用
cctype头文件函数: isalnum(c) isalpha(c) iscntrl(c) isdigit(c) isgraph(c) islower(c) isprint(c) ispunct(c) isspace(c) isupper(c) isxdigit(c) tolower(c) toupper(c)
for (declaration : expression) statement
for (auto c : s)
for (auto &c : s)
string可以使用下标运算符 |
3 | 标准库类型 vector
容器container
#include<vector> using std::vector;
C++有类模板和函数模板,vector属于类模板
编译器根据模板创建类或者函数的过程称为实例化instantiation
初始化: vector<T> v1 vector<T> v2(v1) vector<T> v2 = v1 vector<T> v3(n, val) vector<T> v4(n) vector<T> v5{a, b, c, …} vector<T> v5 = {a, b, c, …}
默认有值初始化,根据类型决定
添加元素 vec.push_back()
范围for循环 (不是传统for循环) 不能向vector对象添加元素
|
4 | 迭代器
end()指向尾元素的下一位置
运算符: *iter iter->mem ++iter --iter iter1 == iter2 iter1 != iter2
迭代器类型: iterator const_iterator
vector<int> v; const vector<int> cv; auto it1 = v.begin(); auto it2 = cv.begin();
箭头运算符 -> 将解引用和成员访问结合 it->mem 等价于 (*it).mem
push_back会使vector对象的迭代器失效
运算: iter + n iter - n iter += n iter -= n iter1 - iter2 >, <, <=, >=
距离类型名: difference_type
auto mid = vec.begin() + vec.size() / 2; 二分查找 |
5 | 数组
存放类型相同的元素, vector也是 使用数组时需要确定元素数量,vector可以不确定情况下使用
定义数组时必须指定类型,而不能用auto
字符数组需要留出空间存放结束符
复杂的数组定义: int *ptrs[10]; // ptrs是含有10个整型指针的数组 // int &refs[10] = /* ? */; // error, 不存在引用的数组 int (*Parray)[10] = &arr; // Parray 指向一个含有10个整数的数组 int (&arrRef)[10] = arr; // arrRef引用一个含有10个整型的数组 类型修饰符从右向左依次绑定
数组元素访问: 索引,数组下标size_t类型,size_t定义于cstddef头文件中(stddef.h的C++对应版本)
某些情况下,数组的操作实际上是指针的操作
指针也是迭代器 ++p 可以用数组索引一个不存在的元素(尾指针)进行初始化 int *e = &arr[10]; // 指向arr尾元素的下一位置的指针 也可以使用begin(), end() 定义位于iterator头文件 int *beg = begin(ia); int *last = end(ia);
指针运算结果 auto n = end(arr) - begin(arr); // type: ptrdiff_t
两个指针指向同一个数组时,可以利用关系运算符比较,否则,不能
|
6 | c风格字符串 尽量少使用 c标准库 string函数 cstring头文件 strlen(p) strcmp(p1, p2) // == 0 > 正数 < 负数 strcat(p1, p2) strcpy(p1, p2)
此类函数使用时,需保证数组以空字符结尾
可以使用以空字符结尾的字符数组来初始化string对象,或者为string对象赋值,反之不行 但是可以使用string的c_str成员函数对字符数组赋值 const char *str = s.c_str(); // char * 不可以,必须是const char *
|
7 | 数组初始化vector |
8 | 多维数组
int ia[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; // 里面的花括号非必须 int ib[3][4] = {{0}, {1}, {2}}; // 只初始化每行第一个元素 int ic[3][4] = {0, 1, 2, 3}; // 只初始化第一行
int (&row)[4] = ia[1]; // row绑定至ia的第二行
// 循环遍历 for (auto &row : ia) { for (auto &col : row) { cout << col << " "; } }
int (*pa)[4] = ia; cout << *pa[1] << endl; // ia[1]第一个元素 cout << (*pa)[1] << endl; // ia[0]第2个元素 //cout << (*pa)[1][1] <<" " << (*pa)[2][1] << endl; // error
// 多维数组遍历新用法 for (auto pb = ia; pb != ia + 3; pb++) { for (auto q = *pb; q != *pb + 4; q++) { cout << *q << ' '; }
cout << endl; } // 方法类似上面 for (auto pc = begin(ia); pc != end(ia); ++pc) { for (auto q = begin(*pc); q != end(*pc); ++q) { cout << *q << " "; } cout << endl; }
|
9 | 类型别名简化指针 using int_array int[4]; typedef int int_array[4];
|
10 | define bias origin typedef origin bias; |