C++学习之旅
文章平均质量分 52
Stay--hungry
这个作者很懒,什么都没留下…
展开
-
STL merge函数
功能:将两个有序数列a,b合并为c。merge(a起始, a末尾, b起始, b末尾, c起始);#include <iostream>#include <algorithm>#include <vector>using namespace std;int main(){ int first[] = {5, 10, 15, 20, 25}; int second[] = {50, 40, 30, 20, 10}; int res[原创 2022-03-21 14:20:49 · 406 阅读 · 0 评论 -
next_permutation和prev_permutation
STL提供了两个用来计算排列组合关系的算法,分别是next_permutation和prev_permutation,均在头文件algorithm中。给定一个数组(或字符串),在C++中,该数组中所有元素所构成的所有排列是有序的,这个顺序就是字典序,因此排列所构成的序列是唯一的(不妨称之为基准排序序列)。例如abc所有元素构成的基准排列序列为:abc,acb,bac,bca,cab,cba。123所有元素构成的基准排列序列为:123,132,213,231,312,321对于一个数组a[m]执行n原创 2021-11-04 22:02:04 · 258 阅读 · 0 评论 -
33,C++之map、multimap容器
map/multimap属于关联式容器,底层结构是用二叉树实现。特点map中所有元素都是pair,pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)所有元素都会根据元素的键值自动排序可以根据key值快速找到value值map和multimap区别:map不允许容器中有重复key值元素multimap允许容器中有重复key值元素#include <map>void PrintMap(map<int, int> m){原创 2021-09-07 18:12:03 · 82 阅读 · 0 评论 -
32,C++之set、multiset容器
特点:所有元素在插入时会被自动排序。set/multiset属于关联式容器,底层结构是用二叉树实现。set和multiset区别:set不允许容器中有重复的元素multiset允许容器中有重复的元素set插入数据的同时会返回插入结果,表示插入是否成功multiset不会检测数据,因此可以插入重复数据 pair<set<int>::iterator, bool> res;//insert的返回值是这样的pair类型 set<int> s; res =原创 2021-09-05 18:10:13 · 81 阅读 · 0 评论 -
31,C++之list容器
STL中的链表list是一个双向循环链表。list有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。list的迭代器可以双向访问,但不支持随机访问。可以p ++; 但不能p = p + 1;1,list的创建list<T> lst; //list采用采用模板类实现,对象的默认构造形式:list(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。list(const list &lst); //拷贝原创 2021-07-30 17:13:02 · 57 阅读 · 0 评论 -
30,C++之queue容器
只有队头和队尾可以被外界使用,因此队列也不可以遍历。构造函数:queue<T> que; //queue采用模板类实现,queue对象的默认构造形式queue(const queue &que); //拷贝构造函数赋值操作:queue& operator=(const queue &que); //重载等号操作符数据存取:push(elem); //往队尾添加元素pop(); //从队头移除第一个元素back(); //返回最后一个元素fro原创 2021-07-30 15:28:39 · 69 阅读 · 0 评论 -
29,C++之stack容器
栈只有栈顶元素可以被外界使用,因此栈没有遍历行为。构造函数:stack<T> stk; //stack采用模板类实现, stack对象的默认构造形式stack(const stack &stk); //拷贝构造函数赋值操作:stack& operator=(const stack &stk); //重载等号操作符数据存取:push(elem); //向栈顶添加元素pop(); //从栈顶移除第一个元素top(); //返回栈顶元素大小操作:原创 2021-07-30 15:17:20 · 73 阅读 · 0 评论 -
28,C++之pair容器
pair对组是成对出现的两个数据,例如如果一个函数需要返回两个数据,那么可以考虑使用pair。pair对组的创建方法:pair<type, type> p(value1, value2);pair<type, type> p = make_pair(value1, value2);用first、second来访问这两个成员。int main(){ pair<string, int> p("Tom", 18); cout << p.first原创 2021-07-16 20:00:38 · 180 阅读 · 0 评论 -
27,C++之STL排序
文章目录sortrandom_shufflemergereversesort对容器内元素进行排序 sort(iterator begin, interator end, _Pred);#include <iostream>#include <algorithm>#include <vector>#include <functional>using namespace std;void print(int val){ cout <&原创 2021-07-14 12:50:44 · 211 阅读 · 0 评论 -
26,C++之deque容器
deque与vector区别:vector对于头部的插入删除效率低,数据量越大,效率越低deque相对而言,对头部的插入删除速度回比vector快vector访问元素时的速度会比deque快,这和两者内部实现有关1,deque的构造函数deque<T> deqT; //默认构造形式deque(beg, end); //构造函数将[beg, end)区间中的元素拷贝给本身。deque(n, elem); //构造函数将n个elem拷贝给本身。deque(const dequ.原创 2021-07-12 16:54:00 · 108 阅读 · 0 评论 -
25,C++之string容器
string本质上是一个类。内部封装了char*以指向字符串,也封装了find()、copy()等许多成员函数。文章目录1,string的构造函数2,string的赋值3,string的拼接4,string的查找5,string的替换6,string的比较7,string的存取8,string的插入9,string的删除10,string的子串1,string的构造函数string();//创建一个空的字符串string str;string(const char *str);//使用字符原创 2021-07-11 17:08:56 · 89 阅读 · 0 评论 -
24,C++之vector容器
STL(Standard Template Library)从广义上分为:容器、算法、迭代器。大体上STL分为六大组件:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。容器和算法之间通过迭代器进行无缝连接,算法要通过迭代器才能访问容器中的元素,每个容器都有自己专属的迭代器。文章目录vector1,用vector存放基本类型2,用vector存放自定义的数据类型3,vector容器嵌套容器vector1,用vector存放基本类型包含头文件<vector>语法:vector&原创 2021-07-10 21:53:33 · 67 阅读 · 0 评论 -
23,C++之模板
注意:1,模板不可以直接使用,它是一个框架2,模板不是万能的一,函数模板作用:建立一个通用的函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。语法:tamplate<typename T>template<typename T> // 设置T为一个通用的数据类型 void MySwap(T &a, T &b)//函数的声明或者定义必须要紧跟在模板声明的下一行{ T tmp = a; a = b; b = tmp;}原创 2021-07-10 17:41:55 · 93 阅读 · 0 评论 -
22,C++之多态
多态分为两类:静态多态:函数重载、运算符重载动态多态:派生类和虚函数实现实现运行时多态静态多态与动态多态的区别:静态多态的函数地址早绑定,编译阶段就确定了函数地址动态多态的函数地址晚绑定,运行阶段才确定函数地址动态多态的条件:1,有继承关系2, 子类要重写父类中的函数:即只有函数内容不同动态多态的使用:将子类的对象传给父类的指针或者引用class Animal{public: void speak() { cout << "动物在说话" <<原创 2021-07-10 15:46:01 · 101 阅读 · 0 评论 -
21,C++之继承
继承当一个类中含有很多与其它类相同的属性的时候,可以使用继承以减少重复的代码。继承的语法为:class 子类(派生类): 继承方式 父类(基类)class Father{public: void func1() { cout << "func1" << endl; } void func2() { cout << "func2" << endl; }};class Son: public Father //声明Son类继承Fa原创 2021-07-09 18:12:34 · 56 阅读 · 0 评论 -
20,C++之运算符重载
对于内置的数据类型,编译器知道如何进行运算,而对于自定义的数据类型,就需要对已有的运算符重新进行定义,赋予其另一种新的功能。一,一般运算的重载1,以成员函数的形式实现运算符重载class Person{public: Person operator+(Person p)//加号的运算符重载 ,可以把operator+视为一个函数名 { Person tmp; tmp.age = this->age + p.age;//即 tmp.age = age + p.age; ret原创 2021-07-06 19:13:39 · 107 阅读 · 0 评论 -
19,C++之友元
友元的目的就是让一个函数或者类访问另一个类中的private成员。1,全局函数作友元class Home{ friend void func(); //友元的声明,使得func()可以访问类中的private变量 public: Home() { livingroom = "l"; bedroom = "b"; } public: string livingroom;private: string bedroom;};void func()//这是一个全局函数 {原创 2021-07-05 20:52:02 · 87 阅读 · 0 评论 -
18,C++之对象模型与this指针
1,类中成员的存储每个对象的地址都是独一无二的。class Person{};int main(){ Person p; cout << sizeof(p) << endl;//输出1 //即使是空对象也会占用一个字节,是为了先占用一个空间,确保多个对象不会存储在同一内存 return 0; } 只有非静态成员变量会存储在对象上class Person{ int a; };int main(){ Person p;//类中的非静态成原创 2021-07-04 17:41:05 · 49 阅读 · 0 评论 -
17,C++之类的静态成员
静态成员1,静态成员变量注意事项:2,静态成员函数原创 2021-07-04 15:06:42 · 138 阅读 · 0 评论 -
16,C++之构造函数与析构函数
对象的初始化和清理1,构造函数与析构函数对象的初始化和清理也是两个非常重要的安全问题,一个对象或者变量没有初始状态,对其使用后果是未知。同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题。c++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供,编译器提供的构造函数和析构函数是空实现。构造函数:主要作用在于创建对象时为对象的成员属性赋值原创 2021-07-01 19:53:03 · 56 阅读 · 0 评论 -
15,C++之类和对象
C++面向对象的三大特性:封装继承多态C++认为万事万物都皆为对象,对象上有其属性和行为。具有相同属性和行为的对象归为同一类,即对象是类中的具体个体。例如: 人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌… 车也可以作为对象,属性有轮胎、方向盘、车灯…,行为有载人、放音乐、放空调… 具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类...原创 2021-06-29 19:15:48 · 113 阅读 · 0 评论 -
14,C++之函数重载
C++允许函数名可以重复,提高复用性。但需要满足以下条件:同一个作用域下函数参数个数不同 or 参数类型不同 or 参数类型顺序不同注意: 函数的返回值不同不可以作为函数重载的条件//函数重载需要函数都在同一个作用域下void func(){ cout << "func 的调用!" << endl;}void func(int a)//参数个数不同{ cout << "func (int a) 的调用!" << endl;}vo原创 2021-06-26 17:08:16 · 50 阅读 · 0 评论 -
13,C++之函数的默认参数与占位参数
1,什么是函数的默认参数默认参数指的是当函数调用中省略了实参时自动使用的一个值。例如如果将void wow(int n)中n设置默认值为1,则函数调用wow()相当于wow(1),若调用wow(3),则函数仍取3作为参数正常工作,3将覆盖默认值。2,如何设置函数的默认参数通过修改函数原型来设置默认参数。例如char* left(const char* str, int n = 1);//该函数返回一个新的字符串;由于const,传入的参数字符串不会改变;函数设置了n的默认值为1由于调用函数时原创 2021-05-26 22:47:58 · 206 阅读 · 0 评论 -
12,C++之内联函数
常规函数和内联函数之间最主要的区别不在于编写方式,而在于C++编译器如何将他们组合到程序中。源代码经编译生成的可执行程序由一组机器语言指令组成,每条指令都有特定的内存地址。常规函数调用...原创 2021-05-15 22:42:04 · 61 阅读 · 0 评论 -
11,C++之引用变量
引用变量(名词)引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,用变量名称可以指向变量,也可以使用该引用名称来指向该变量。引用很容易与指针混淆,它们之间有三个主要的不同:不存在空引用。引用必须连接到一块合法的内存。一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。引用必须在创建时被初始化。指针可以在任何时间被初始化。C++ 中创建引用试想变量名称是变量附属在内存位置中的标签,可以把引用当成是变量附属在内存位置原创 2021-05-13 22:52:51 · 199 阅读 · 0 评论 -
10,C++之auto
1,autoC++11 auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,类似的关键字还有decltype。 int a = 10; auto au_a = a;//自动类型推断,au_a为int类型 cout << typeid(au_a).name() << endl;typeid运算符可以输出变量的类型。此处输出了 ‘ i ',即表示au_a为int型。注意:auto的自动类型推断发生在编译期,所以使用auto并不会原创 2021-05-12 22:12:58 · 100 阅读 · 0 评论 -
9,C++之文件的输入输出
#include <iostream>#include <fstream>//必须包含头文件<fstream> #include <cstdlib>using namespace std;ofstream outFile;//自定义、声明ofstream对象 ofstream fout;ifstream inFile;//自定义、声明ifstream对象ifstream fin;int main(){ outFile.open("F:原创 2021-04-11 14:56:31 · 49 阅读 · 0 评论 -
8,C++之for
1,C++允许在括号内定义变量,但该变量只能在该for循环内部使用。2,定义一个const值来表示数组长度是个好办法。#include <iostream>using namespace std;int main(){ string word; cin >> word; for (int i = 0; i < word.size(); i ++) cout << word[i] << " "; return 0;} 3,可以使原创 2021-04-05 21:57:56 · 111 阅读 · 0 评论 -
7,C++之指针
1,使用new来分配内存看起来,变量是在编译时分配的有名字的内存,而指针只是为可以直接通过名称访问的内存提供了一个别名。指针的真正用武之地在于:在运行阶段分配未命名的内存以存储值。当需要内存时,可以使用new来请求。new运算符可以开辟一段内存,并返回该内存的首地址。程序员所要做的就是:告诉new要为何种数据类型分配内存,new开辟相应长度的内存后,返回地址,程序员再将该地址赋给一个指针变量。在这种情况下,该内存只能由指针进行访问,此时*p便可视作一个变量 int *p = new int;原创 2021-04-02 19:39:35 · 48 阅读 · 0 评论 -
6,C++之结构体
C++允许在声明结构变量时省略关键词struct结构体的初始化:#include <iostream>using namespace std;int main(){ struct hello { char name[10]; //结构体中可以将string类作为成员 //也可以改为string类 :string name; int num; char ch; }; hello li = {"Li ming", 2, 'B'};//C++允许在声明结构变原创 2021-04-02 17:15:32 · 48 阅读 · 0 评论 -
5,C++之字符串
1,C-style stringC-风格字符串具有一种特殊的性质:以空字符’\0’结尾,ASCII码为0。 char string1[6] = {'H', 'e', 'l', 'l', 'o', '\0'};//一个一个数组元素的进行赋值时,需要手动加上'\0'结束符 char string2[6] = "Hello";//在通过使用字符串常量进行对字符数组的赋值时,不必加上'\0',编译器会自动加上'\0' //不论使用哪种方法,在对数组进行字符串的赋值时,要确保数组足够大,能够存储所有字符——原创 2021-04-01 16:28:04 · 55 阅读 · 0 评论 -
4,C++之数据类型
1,sizeof运算符可以返回数据类型或变量的长度(单位为字节)在对类型名进行sizeof时,类型名应在括号内;对变量进行时,括号可有可无。2,头文件< climits >中包含了关于关于整型限制的信息,比如:符号名称等。如:INT_MAX为 int类型的最大取值,CHAR_BIT为字节的位数…#include <iostream>#include <climits>int main(){ using namespace std; cout <<原创 2021-03-30 14:09:19 · 62 阅读 · 0 评论 -
3,C++之自定义函数
#include <iostream>//若在程序前面,主函数外写using namespace std; 则在之后的main函数、自定义函数中都不需要再写using namespace std;了(即程序中所有函数都可以访问std空间了)void Plus(int, int);//进行函数声明,提供函数原型//也可直接将函数定义在main函数之前int main(){ using namespace std; int a, b; cin >> a >原创 2021-03-28 19:36:37 · 525 阅读 · 0 评论 -
2,C++之输出与输入
1,使用cout进行输出 cout << "hello, world";双引号内为需要输出的字符串。“<<” 符号表示该语句将把这个字符串发送给cout;该符号指出了信息流动的路径。cout是一个预定义过了的对象,它将字符串、数字等插入到输出流中。(这体现出了对象的优点:不用了解对象的内部情况,只需要知道它的接口,便可以使用它。)#include <iostream>using namespace std;int main(){ char stri原创 2021-03-28 19:17:13 · 178 阅读 · 0 评论 -
1,C++之初识C++
1, c++对大小写敏感,即区分大写字符与小写字符。c++能够使用printf() , scanf() , 和其它所有标准C输入工具和输出函数,只需要包含常规的stdio.h头文件。main()函数可以给调用它的函数返回一个整数值,且不从调用它的函数那里获得任何信息。在c++中,main() 与 main(void) 等效输入输出函数cin 、cout 函数在头文件 < iostream > 中,c++的新式风格中, 头文件后没有扩展名 .h ,这样的头文件可以包含名称空间namespa.原创 2021-03-28 15:32:39 · 308 阅读 · 0 评论