Bootstrap

c++学习笔记

1、endl介绍

   endl会输出'\n'(题外话,\n是转义字符,字符字面值常量的一员,很多语言都支持,不是C专有),然后立即刷新缓冲区并输出到屏幕上。由于要刷新缓冲区,endl会比\n慢一点,一般不建议使用。(cout>>a>>endl)endl 最后一个字符是字母“l”,而非阿拉伯数字“1”,它是“end of line”的缩写。

2、cin和cout输入输出

在C语言中,使用 scanf 和 printf 来对数据进行输入输出操作。而在C++语言中,C语言的这一套输入输出库仍然能使用,但是 C++ 又增加了一套新的、更容易使用的输入输出库cin和cout。使用 cout 进行输出时需要紧跟<<运算符,使用 cin 进行输入时需要紧跟>>运算符,这两个运算符可以自行分析所处理的数据类型,因此无需像使用 scanf 和 printf 那样给出格式控制字符串。

3、algorithm库 

1.非修改性顺序操作(12个)


循环:对序列中的每个元素执行某操作 for_each() 

查找:在序列中找出某个值的第一次出现的位置 find() 利用底层元素的等于操作符,对范围内的元素与输入的值进行比较。当匹配时,结束搜索,返回该元素的一个 InputIterator 。

b.find(a);这句代码的意思就是从b字符串中查找a字符串。返回值是字母在母串中的位置(下标记录),如果没有找到,那么会返回一个特别的标记npos.

在序列中找出符合某谓词的第一个元素 find_if()

在序列中找出一子序列的最后一次出现的位置 find_end()

在序列中找出第一次出现指定值集中之值的位置 find_first_of()

在序列中找出相邻的一对值 adjacent_find() 

计数:在序列中统计某个值出现的次数 count()

count函数
algorithm头文件定义了一个count的函数,其功能类似于find。这个函数使用一对迭代器和一个值做参数,返回这个值出现次数的统计结果。
编写程序读取一系列int型数据,并将它们存储到vector对象中,然后统计某个指定的值出现了多少次。也可以读取字符串中某个字母的个数,不过字母要用单引号,不是双引号。
核心代码:

cout<<count(ivec.begin() , ivec.end() , searchValue)

在序列中统计与某谓词匹配的次数 count_if()

比较:找出两个序列相异的第一个元素 mismatch()

两个序列中的对应元素都相同时为真 equal() 

搜索:在序列中找出一子序列的第一次出现的位置 search()

在序列中找出一值的连续n次出现的位置 search_n()

2.可变顺序操作(27个)


复制:从序列的第一个元素起进行复制 copy()

从序列的最后一个元素起进行复制 copy_backward() 

交换:交换两个元素 swap()

交换指定范围的元素 swap_ranges()

交换由迭代器所指的两个元素 iter_swap() 

变换:将某操作应用于指定范围的每个元素 transform() 

替换:用一个给定值替换一些值 replace()

替换满足谓词的一些元素 replace_if()

复制序列时用一给定值替换元素 replace_copy()

复制序列时替换满足谓词的元素 replace_copy_if() 

填充:用一给定值取代所有元素 fill()

用一给定值取代前n个元素 fill_n()

生成:用一操作的结果取代所有元素 generate()

用一操作的结果取代前n个元素 generate_n() 

删除:删除具有给定值的元素 remove()

删除满足谓词的元素 remove_if()

复制序列时删除具有给定值的元素remove_copy()

复制序列时删除满足谓词的元素 remove_copy_if() 

唯一:删除相邻的重复元素 unique()

复制序列时删除相邻的重复元素 unique_copy() 

反转:反转元素的次序 reverse()

复制序列时反转元素的次序 reverse_copy() 

环移;循环移动元素 rotate()

复制序列时循环移动元素 rotate_copy() 

随机:采用均匀分布来随机移动元素 random_shuffle()

划分:将满足某谓词的元素都放到前面 partition()

将满足某谓词的元素都放到前面并维持原顺序stable_partition()

3.排序和关系操作(27个)


排序:以很好的平均效率排序sort (first, last),默认进行升序排序。对容器或普通数组中 [first, last) 范围内的元素进行排序,默认进行升序排序。升序:sort(begin,end,less<data-type>());
降序:sort(begin,end,greater<data-type>()).

排序,并维持相同元素的原有顺序 stable_sort()

将序列的前一部分排好序partial_sort()

复制的同时将序列的前一部分排好序 partial_sort_copy() 

第n个元素 将第n各元素放到它的正确位置 nth_element() 

二分检索 找到大于等于某值的第一次出现 lower_bound()

找到大于某值的第一次出现 upper_bound()

找到(在不破坏顺序的前提下)可插入给定值的最大范围 equal_range()

在有序序列中确定给定元素是否存在 binary_search() 

归并:归并两个有序序列 merge()

归并两个接续的有序序列 inplace_merge() 

有序结构上的集合操作 一序列为另一序列的子序列时为真 includes()

构造两个集合的有序并集 set_union()

构造两个集合的有序交集 set_intersection()

构造两个集合的有序差集 set_difference()

构造两个集合的有序对称差集(并-交) set_symmetric_difference() 

堆操作:向堆中加入元素 push_heap()

从堆中弹出元素 pop_heap()

从序列构造堆 make_heap()

给堆排序 sort_heap() 

最大和最小 两个值中较小的 min()

两个值中较大的 max()

序列中的最小元素 min_element()

序列中的最大元素 max_element() 

接收参数:容器的首尾地址(迭代器)(可以是一个区间) 

返回:最值元素的地址(迭代器),需要减去序列头以转换为下标

*max_element()与*min_element()分别用来求最大元素和最小元素的值。

接收参数:容器的首尾地址(迭代器)(可以是一个区间)

返回:最值元素的值

词典比较 两个序列按字典序的第一个在前 lexicographical_compare() 

排列生成器 按字典序的下一个排列 next_permutation()

按字典序的前一个排列 prev_permutation()
原文链接:https://blog.csdn.net/qq_38251358/article/details/113105746

4、C++标准库之iomanip库(格式输入输出)

参考: 【C++】C++标准库之iomanip库(格式输入输出)_Jacky_Feng的博客-CSDN博客

      控   制   符                                作           用                                     
 dec      设置整数为十进制
 hex     设置整数为十六进制
 oct     设置整数为八进制
 setbase(n)     设置整数为n进制(n=8,10,16)
 setfill(c)     设置字符填充,c可以是字符常量或字符变量

 setprecision(n)     设置浮点数的有效数字为n位
 setw(n)     设置字段宽度为n位
 setiosflags(ios::fixed)     设置浮点数以固定的小数位数显示
 setiosflags(ios::scientific)       设置浮点数以科学计数法表示
 setiosflags(ios::left)     输出左对齐
 setiosflags(ios::right)     输出右对齐
 setiosflags(ios::skipws)     忽略前导空格
 setiosflags(ios::uppercase)     在以科学计数法输出E与十六进制输出X以大写输出,否则小写。
 setiosflags(ios::showpos)     输出正数时显示"+"号
 setiosflags(ios::showpoint)     强制显示小数点
 resetiosflags()      终止已经设置的输出格式状态,在括号中应指定内容


5、Condition ? X : Y

Condition ? X : Y条件运算符。如果 Condition 为真 ? 则值为 X : 否则值为 Y。
,逗号运算符会顺序执行一系列运算。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。

6、long int与long long的区别

long int即long,给人的感觉好像是长整型,但实际上,它和int一样,只有32位。 long long则不同,long long是C++的64位整型的基本类型,“现任”长整型。

7、sizeof(object)

sizeof(object) 是一个关键字,它是一个编译时运算符,用于判断变量或数据类型的字节大小。

sizeof 运算符可用于获取类、结构、共用体和其他用户自定义数据类型的大小。

8、getline()

getline()   

  // 接受一个字符串,可以接收空格并输出,需包含“#include<string>” ,和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数

istream& getline (istream&  is, string& str, char delim);

is    :表示一个输入流,例如 cin。

str   :string类型的引用,用来存储输入流中的流信息。

delim :char类型的变量,所设置的截断字符;在不自定义设置的情况下,遇到’\n’,则终止输入。

cin.get()

用法1: cin.get(字符变量名)可以用来接收字符

用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格

cin.getline() // 接受一个字符串,可以接收空格并输出

cin.getline()函数的完整形式有三个参数:cin.getline(字符数组名,字符个数,结束标志)

9、string常用函数 

参考:c++中的string常用函数用法总结-CSDN博客

①append函数用在字符串的末尾添加字符和字符串,功能用法类似python的append函数

参考:c++中 append()函数用法_c++ append-CSDN博客

  string& append (const string& str):

在字符串的末尾添加字符串str。

string& append (const char* s):

在string的末尾添加C-string。把c类型字符串s连接到当前字符串结尾


string& append (const string& str, size_t subpos, size_t sublen):
 在字符串的末尾添加字符串str的子串,子串以subpos索引开始,长度为sublen。若是添加的子串中只有索引开始的位置,没有长度,则表示字符串从第n个字符到末尾的字符连接到当前字符串末尾

10、指针

参考:C++ 指针的算术运算 | 菜鸟教程 

11、sizeof()

sizeof (data type)

sizeof 是一个关键字,它是一个编译时运算符,用于判断变量或数据类型的字节大小。

sizeof 运算符可用于获取类、结构、共用体和其他用户自定义数据类型的大小。返回的是变量声明后所占的内存数

其中,data type 是要计算大小的数据类型,包括类、结构、共用体和其他用户自定义数据类型。 

若其中是表达式,或函数,对象,则结果是表达式值类型大小,函数返回值类型大小,对象类型大小。 

12、c++标准库之cstring

string、string.h和cstring的区别是很大的。string.h是c语言的库,用于处理char *类型的字符串。string和cstring是c++标准库的东西,位于std名字空间。string是c++标准库中的一个类,它实际上是basic_string模版类实例化产生的。cstring兼容了过去string.h的函数,但是采用了c++的写法。最后CString和cstring还有区别前者是mfc中的一个类。

strlen() 可以得到字符数组中第一个\0前的字符的个数,格式如下:

strlen(字符数组);
	CString str("hello");
    cout << str.GetLength() << endl;//得到字符串长度,不包括'\0'

	cout << str.GetAt(4) << endl;//得到单个字符下标

	cout << str.IsEmpty() << endl;//判断字符串是否为空,1为空,0不为空

	str.SetAt(4,'w');//设置下标单个字符
	cout << str << endl;

	cout << str.Mid(2,2) << endl;//从第二个位置获取后两个字母

	cout << str.Left(3) <<	endl;//从左边第三个往左边获取三个字母

	cout << str.Right(3) << endl;//从右边第三个往右边获取三个字母

	cout << str.MakeUpper() << endl;//将字符串全部转换成大写

	cout << str.MakeLower() << endl;//将字符串全部转换成小写

	cout << str.MakeReverse() << endl;//将字符串倒序

13、C++中的动态数组

参考:C++ 动态数组(new)_c++ new数组-CSDN博客

  • 动态数组的维度可以为常量、也可以为一个函数的返回值
  • 使用typedef为数组类型取别名
  • typedef int arrT[42];
    int *p=new arrT;  //分配一个大小为42的int型数组
  • 默认情况下,new分配的对象都有默认初始化
  • int *p1=new int[10];   //10个未初始化的int
    int *p2=new int[10](); //10个初始化为0的int
    string *p3=new string[10];  //10个空的string
    string *p4=new string[10]();//10个空的string
  • C++11标准:花括号初始化器初始化
  • int *p1=new int[5]{0,1,2,3,4};
    string *p3=new string[3]{"a","the",string(3,'x')};
    动态数组的释放
  • 使用delete释放,并且在数组名前需要加上“[]”
  • 释放的顺序:数组中的元素按照逆序销毁,即最后一个元素首先被销毁,然后倒数第二个....以此类推
  • typedef int arrT[10];
     
    int *p=new arrT;
    delete []p

    定义指针指向二维数组

  • 为了方便根据用户输入动态定义二维数组的行和列,引入变量rowsNum(行),colsNum(列)。

    以定义5行4列的二维数组为例,

    int rowsNum = 4;
        int colsNum = 5;
        
        float** a = new float*[rowsNum];
        for(int i = 0; i < rowsNum; i++)
        {
            a[i] = new float[colsNum];
        }

14、字符串分类统计

isalpha():判断字符是否为字母

isdigit():判断字符是否为数字

isspace():判断是否为空格、字表符、换行等标准空白;

isalnum():判断字符是否为字母或者数字;

ispunct():判断字符是否为标点符号;

islower():判断字符是否为小写字母;

isupper():判断字符是否哦为大写字母。

 

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;