1、string
定义和初始化string对象
string s1; //默认初始化,空字符串
string s2=“sad”; //拷贝初始化,用等号进行初始化
string s3(“sad”); //直接初始化
cin>>s; //输入s
cout<<s; //输出s
s.empty() s为空返回true,否则为false
s.size() 返回s中的字符数
s1+s2 连接字符串 加号左右至少有一个是string对象,不能全是字符串字面值
s1=s2 用s2的副本替代s1
==,!= 比较
getline(cin,s) 读取一整行,而不是连读的词
cctype头文件 cname和name.h表示同一个头文件 cname比较符合C++命名方式
for(declaration : expression)
statement
expression表示一个序列,declaration表示一个变量,用于访问序列的基础元素
s=”hello world”
for(auto c : s)
cout<<c<<endl;
按字符依次打出hello world
s=”hello world”
for(auto &c : s) //定义自动变量类型
c=toupper(c); //如果为小写,改为大写 tolower大写改小写
cout<<s<<endl;
输出HELLO WORLD
Decltype(A) 返回A的类型,用于定义其它变量
Typeid(A).name() 返回A的类型名
2、标准库类型vector 容器
表示对象的集合,其中对象的类型都相同
#include
using std::vector;
模板本身不是类或函数,编译器根据模板创建类或函数的过程称为实例化。
C++11新标准 应该写成vector<vector >而非vector<vector>。右尖括号前有一个空格。
定义和初始化vector对象
vector<T> v1 v1是一个空vector,T类型,默认初始化
vector<T> v2(v1) v2包含v1所有元素副本
vector<T> v2=v1 与上式等价
vector<string> sver; //默认初始化,不包含任何元素
列表初始化
vector<string> sver = {“ad”,“das”,“dasd”};
vector<int> v1(10); //v1有10个元素,每个值都是0
vector<int> v2{10}; //v2有1个元素,该元素值是10
vector<string> v3(“hi”); //报错,不能用字面值初始化
vector<string> v3{“hi”}; //初始化为hi
向vector对象添加元素 push_back 放在尾端
string word;
vector<string> text; //空vector对象
while(cin>>word)
{
text.push_back(word); //把word添加到text后面
}
for (auto i:text)
cout<<i<<endl;
v.empty() 不含元素为真,反之为假
v.size() 返回元素个数
v.push_back(i) 尾端添加元素i
vector 与 array 的差异
不能用下标形式去添加元素
迭代器iteraor
begin end begin指向第一个字符 end指向尾后
auto b=v.begin(),e=v.end(); //b和e的类型相同
容器为空时,返回的是同一个迭代器
可以用== 和!=来比较两个合法的迭代器
*iter 返回iter所指元素的引用
iter->mem 等价(*iter).mem 获取成员
++iter 指向下一元素
--iter 指向上一元素
isspace() 检测是否为空格
iterator const_iterator 来表示迭代器的类型 返回对象是否为常量
c++11引入cbegin和cend返回const_iterator
解引用迭代器可以获得所指对象,可进一步访问其成员
但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素
迭代器运算
iter+n,iter-n 指向位置变化
<,> 用来比较位置
auto mid=vi.begin()+vi.size()/2; //计算得到最接近中间元素的一个迭代器
if(it<mid) //只处理前半部分元素
iter1-iter2 右侧iter2向前移动多少位置到左侧iter1 可正可负
difference_type的带符号整型数
常用二分搜索
auto beg=text.begin(),end=text.end();
auto mid=text.begin()+(end-beg)/2;
while(mid!=end&&*mid!=sought)
{
if(sought<*mid)
end=mid;
else
beg=mid+1;
mid=beg+(end-beg)/2;
}
3、数组
数组的大小固定,不可以随意添加元素,相对于vector失去了一定的灵活性。
定义数组时必须制定数据类型,不能使用auto进行推断。
显式初始化数组元素 可以部分初始化,其余默认初始化
字符数组 结尾需要有空字符 \0
不允许拷贝和赋值
理解复杂的数组声明
int *ptrs[10]; //ptrs是含有10个整型指针的数组
int (*Parray)[10]=&arr; //Parray指向一个含有10个整数的数组
int (&arrRef)[10]=arr; //arrRef引用一个含有10个整数的数组
访问数组元素
索引从0开始 定义为size_t类型 无符号类型,且足够大 在标准库stddef.h头文件中定义
防止越界
在使用数组时编译器一般会把它编译成指向该数组首元素的指针。
标准库函数begin和end
通过这个来获取数组首尾指针。
int a[10]={};
int *bed=begin(a); //指向首元素指针
int *last=end(ia); //指向尾元素的下一位置指针
两个指针相减的结果类型为 ptrdiff_t 标准库类型,定义在cstddef头文件中
内置下标运算符可以为负数
C风格字符串 容易产生风险
C标准库string函数
char a[]=“hello”;
cstring是C语言头文件string.h的c++版本
strlen(p) 返回长度,空字符不计算在内
strcmp(p1,p2) 比较p1,p2 p1>p2为正 p1==p2 为0 ,其余为负数
比较字符串
string a=“hello”;
直接用<,>进行比较
如果是char a[]类型比较的是指向首位元素的指针
使用string标准库要比C风格字符串更高效和安全
使用数组初始化vector对象 反之不允许
int int_arr[]={0,1,2,3,4,5};
vector ivec(begin(int_arr),end(int_arr)); //首尾元素地址
地址可以替换,包头不包尾 &int_arr[index]
尽量使用vector 和迭代器,避免使用内置数组和指针
尽量使用string
多维数组
遍历
size_t cnt=0;
for (auto &row:a)
for(auto &col:row)
{
col=cnt;
++cnt;
}
4、表达式
算术运算符
一元运算符、二元运算符
重载运算符
左值表达式的求解结果是一个对象或者一个函数
右值使用的是对象的值(内容),左值是对象(在内存中的位置)
优先级和结合律
复合表达式是指含有两个或多个运算符的表达式。
求值顺序不确定时可以用括号来强制表达。
bool b=true;
bool b1=-b; //b1还是true 布尔值不参与运算
C++11新标准规定商一律向0取整。
短路求值
逻辑与&&,当左值为真时才计算右值
逻辑或||,当左值为假时才计算右值
除非必须,否则不用递增递减运算符的后置版本。
p++ 等价于(p++) 后置递增运算符的优先级高于解引用运算符
cout<<*p++<<endl;
cout<<*p<<endl;
++p;
两种写法等价,第一种写法更为简洁
成员访问运算符
获取类对象成员
ptr->men 等价于 (*p).men
条件运算符
cond?expr1:expr2;
表达式可以嵌套,但注意可读性
位运算符 作用于整数类型的运算对象,并把运算对象看作二进制位的集合
移位运算符
位求反运算符
sizeof运算符
返回一个表达式或一个类型名字所占的字节数。
类型转换 隐式转换
显式转换 强制类型转换
命名的强制类型转换
cast-name(expression);
type目标类型expression转换值
static_cast,dynamic_cast,const_cast和reinterpret_cast中的一种。
5、语句
空语句 ;
复合语句 {}
语句作用域
结构变量 作用范围
条件语句
悬垂else 与最近的if进行匹配
switch case 一般需要break,否则会继续向下执行
default
迭代语句
while、for
范围for语句
range for statement
for(declaration:expression)
statement
expression表示的必须是一个序列
declaration定义一个变量 可用auto
do while 先执行,后检查
do
statement
while(condition);
跳转语句
break,continue,goto,return
break负责终止离它最近的while、do while、for或switch
continue 终止最近循环的当前迭代
goto 跳转到同一函数的另一条语句
try 语句块和异常处理
异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。
throw表达式 raise
try语句块 catch
throw runtime_error(“error”);
runtime_error是标准库异常类型的一种,定义在stdexcept
标准异常
exception头文件定义了最通用的异常类exception,只报告异常的发生,不提供任何额外信息。
stdexcept头文件
new头文件定义了bad_alloc异常类型
type_info头文件定义了bad_cast异常类型
terminate 当异常没有被捕捉到时调用,终止当前程序执行
6、函数
返回类型、函数名字、形参、函数体
实参是形参的初始值,类型需要匹配
分离式编译 separate compilation
参数传递
引用传递 值传递
指针形参
传引用参数
int &r=n; //r绑定了n 修改r, n也会变