C++学习笔记
前言
放了寒假了,也不能去外边玩,游戏也玩的没意思了。只能窝在家好好学习了哈哈。
之前做数据结构题的时候,有好多都不会,然后就去CSDN上找那些大佬们做的,其中好多都是C++的,感觉C++好像很厉害,于是就买了一本C++的书,叫《c++ Primer》的书,第五版的,准备自学!!!
做这个笔记也无非就是想督促一下自己,希望能坚持下去吧!!
以下好多笔记都是源自于书上,若有侵权,立马删除!!!
提示:笔记主要还是挑一些重点的来看吧,基本上是那些不用于C的。
如果大佬们还有自己认为重要的知识点,欢迎来补充~~~
感谢!!!
一、变量和基本类型
1.处理类型
(1)auto类型说明符
auto是让编译器自己去分析表达式所属的类型
它会忽略顶层const,如果希望是顶层的,则需声明出来
int i=1;
const int ci=i, &cr=ci;
auto b=ci; //b是一个整数,ci的顶层const被忽略掉了
auto c=cr; //c是一个整数,同上
auto d=&i; //d是一个整型指针
auto e=&ci //e是一个指向整数常量的指针,底层const
const auto f=ci; //ci的推演类型是int,f是const int
(2)decltype类型指示符
选择并返回操作数的数据类型
decltype((variable))的结果永远是 引用
decltype(variable)的结果只有当variable本身就是一个引用时才是引用
decltype(f()) sum=x; //sum的类型就是函数f的返回类型
decltype((i)) d; //错误:d是int&,必须初始化
decltype(i) d; //正确:e是一个(为初始化的)int
二、字符串、向量和数组
using:头文件不应包含using
1.String
(1)初始化
string s1; //默认初始化,s1是一个空字符串
string s2(s1); //s2是s1的副本
string s2=s1; //同上
string s3("value"); //s3是字面值"value"的副本,除了字面值最后的那个空字符外
string s(n,'c'); //把s初始化为由连续n个字符c组成的字符
(2)string对象上的操作
操作 | 作用 |
---|---|
os<<s | 将s写到输出流os中,返回os |
is<<s | 从is中读取字符串赋给s,字符串以空白分隔,返回is |
getline(is,s) | 从is中读取一行赋给s,返回is |
s.empty() | 判断为空返回true,不为空返回false |
s.size() | 返回s中字符的个数 |
s[n] | s中第n个字符,n从0开始 |
s1+s2 | s1和s2连接 |
s1=s2 | 赋值 |
s1==s2 | 判断 |
s1!=s2 | 对大小写敏感 |
<,<=,>,>= | 利用字符在字典中的顺序进行比较,对大小写敏感 |
①使用getline读取一整行
如果直接用 cin 输入的话,他会从第一个非空白符开始读取,直到遇见下一处空白为止。
若想要那被忽略掉的空白符,那么就会用到getline语句。
代码如下(示例):
string line;
//每次读取一行,直到文件末尾?
while (getline(cin,line))
cout << line << endl; //line中不包含换行符,需要手动添加
②处理string对象中的字符
此处用到了头文件 cctype
操作 | 作用 |
---|---|
isalnum( c ) | 当c是字母或数字时为真 |
isalpha( c ) | 当c是字母时为真 |
iscntrl( c ) | 当c是控制字符时为真 |
isdigit( c ) | 当c是数字字符时为真 |
isgraph( c ) | 当c不是空格但可打印时为真 |
islower( c ) | 当c是小写字母时为真 |
isprint( c ) | 当c是可打印字符时为真 |
ispunct( c ) | 当c是标点符号时为真 |
isspace( c ) | 当c是空白时为真(空格、制表符、回车、换行、进纸符) |
isupper( c ) | 当c是大写字母时为真 |
isxdigit( c ) | 当c是十六进制时为真 |
tolower( c ) | 如果c是大写字母,则输出小写字母,否则原样输出 |
toupper( c ) | 与上相反 |
要想处理string中的一部分字符
一种是可以像C那样使用下标;
还有一种是使用迭代器(??)
//处理每个字符,用基于范围的for语句
string str("some string");
//每行输出str中的一个字符
for(auto c:str)
cout << c << endl;
2.vector
学完vector之后,第一印象是感觉这个有点像数据结构里边讲的栈,但它比栈灵活多了
(1)初始化
1、引用不可以成为vector的元素,因为他不是对象
2、可以用花括号初始化每一个值
3、可以用括号指定元素个数或相同的元素值
4、只能使用直接初始化,不可以使用拷贝初始化(只有在类型相同的时候才可以拷 贝)
5、适用于三种情况:①初始值已知且数量较少
②初始值是另一个vector对象的副本
③所有元素的初始值都一样
(2)向vector中添加元素
举个书上的例子
vector<int> v; //空vector对象
for(int i=0;i!=100;++i)
v.push_back(i); //依次把整数值放到v的尾端,相当于栈的后入
//循环结束后v有100个元素,从0到99
(3)vector的其他操作
这些操作基本上和string的一些操作差不多
操作 | 作用 |
---|---|
v.empty() | 如果v不含有任何元素,返回真;反之,则假 |
v.size() | v中元素的个数 |
v[n] | 返回v中第n个位置上元素的引用 |
v1=v2 | 用v2中元素的拷贝替换v1中的元素 |
v1={a,b,c…} | 用列表中元素的拷贝替换v1中的元素 |
v1==v2 | v1和v2相等当且仅当它们的元素数量相同且对应位置的元素值都相同 |
<,<=,>,>= | 以字典顺序进行比较 |
vector注意!!!
vector的下标类型和string的一样,都是 size_type 类型。
不能用下表形式添加元素
举个栗子
比如向vector对象中添加10个元素
vector<int> v; //空vector对象
for(decltype ( v.size() ) i=0;i!=10;i++)
v[i]=i;
for(decltype ( v.size() ) i=0;i!=10;i++)
v.push_back(i);
在这里边,第一个for循环是错误的,v是一个空vector,不包含任何元素,所以也就不存在可以通过下标去访问元素。
要想添加元素,就目前而言,只能用push_back(t),向尾端添加元素。