C++ Primer学习笔记

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也会变

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值