C++学习之路
唐火
开始人工智能之路了!!!
展开
-
C++ vector容器中用erase函数和迭代器删除重复元素问题分析
第一种写法:#include <iostream>#include <vector>using namespace std;int main(){ vector<int>v; v.push_back(888); v.push_back(89); v.push_back(89); v.push_back(89); v.push_back(9999); v.push_back(89); for (std::vector<int>::i原创 2021-12-20 18:51:26 · 2466 阅读 · 1 评论 -
C++ vector容器中常见的三种遍历方式
1.迭代器 for (std::vector<int>::iterator it = vecTest.begin(); it != vecTest.end(); ++it) { tempNum = *it; }2.C++11 新增关键字auto for (auto it : vecTest) { tempNum = it; }3.对C念念不舍的童鞋们习惯的数组写法 for (size_t i = 0; i < max转载 2021-12-19 22:57:12 · 539 阅读 · 0 评论 -
C++从vector中删除指定元素
①只删除一个元素vector<int> num;for(vector<int>::iterator iter=num.begin();iter!=num.end();iter++){ //从vector中删除指定的某一个元素 if(*iter==k){ num.erase(iter); break; }}②删除指定的多个重复元素erase函数的返回的是指向被删除元素的下一个元素的迭代器,所以执行erase原创 2021-12-19 22:53:56 · 12005 阅读 · 0 评论 -
利用真值表法求取主析取范式以及主合取范式的实现(C++)
代码如下:#include <iostream>#include <stack>#include <string>#include <vector>using namespace std;const int N = 300;stack<char> s;stack<char> v;int seq;bool vis[N];bool flag[N];void dfs(int n);vector<int>原创 2021-10-31 13:16:45 · 6524 阅读 · 3 评论 -
C++重载输出操作符<<,为什么要返回引用
针对:ostream & operator <<(ostream & os, const ClassType &object)说明几点:1.第一个形参为对ostream对象的引用,在该对象上将产生输出,ostream为非const,因为写入到流会改变流的状态;该形参是一个引用,因为不能复制ostream对象(在c++中定义的标准输入输出流类istream和ostream,其中拷贝构造函数和赋值操作符函数都被放置在了private部分,且只有声明,没有定义)。2.第二个形原创 2021-10-18 16:45:44 · 1840 阅读 · 3 评论 -
C++二维数组作为函数参数
#include <iostream>#include <Windows.h>//版本一 省略函数//二维数组省略一个高维函数 但低维位函数必须定义void printf1(int a1[][3]){ for(int i=0; i<3; ++i){ for(int j=0; j<3; ++j){ printf("%d\t", a1[i][j]); } printf("\n"); }}//版本二 指明参数void printf2转载 2021-10-13 22:04:58 · 527 阅读 · 0 评论 -
C++的new、delete需要注意的一点:使用危险函数导致的越界CRT detected that the application wrote to memory after end of heap
new、delete需要注意的一个特性正常情况new一个数组之后,用delete释放是没有问题的。但是当对new得到的堆区进行越界的写入操作(读操作不会)将会导致delete时出现段错误,无法进行删除。如下面的程序所示:数组大小只有16,但是我们却访问了下标为20的数组中的元素,数组越界了。(CRT detected that the application wrote to memory after end of heap buffer)引用CSDN博主「白夜行的狼」的原创文章中的一段:我原创 2021-08-10 01:33:04 · 879 阅读 · 2 评论 -
C++ setprecision()用法
io 流控制头文件, 主要是一些操纵用法如setw(int n),setprecision(int n)#include < iomanip > setw(n)用法: 通俗地讲就是预设宽度#include<iostream>#include <iomanip>using namespace std;int main(){ cout << setw(5) << 255 << endl; return 0;}原创 2021-07-12 09:49:40 · 8908 阅读 · 3 评论 -
C++ 多态实现的三个条件
多态实现的三个条件:1.必须是公有继承2.必须是通过基类的指针或引用 指向派生类对象 访问派生类方法3.基类的方法必须是虚函数,且完成了虚函数的重写原创 2021-07-12 09:28:54 · 1373 阅读 · 0 评论 -
C++ 虚析构函数
代码如下:#include <iostream>using namespace std;class Base { public: Base() { cout << "Base" << endl; } ~Base() { cout << "Base destructor" << endl; }};class Derived : public Base { public: Derived() {原创 2021-07-12 01:32:17 · 191 阅读 · 0 评论 -
C++ 基类,子对象,派生类构造函数调用顺序
#include <iostream>using namespace std;class A { public: A( ) { cout << "A Constructor………" << endl; } ~A( ) { cout << "A Destructor………" << endl; }};class B: public A { public: B( ) { cout <<.原创 2021-07-11 23:11:38 · 433 阅读 · 4 评论 -
C++ 详解拷贝构造函数
原创 2021-07-11 22:00:30 · 86 阅读 · 0 评论 -
C++ 指向类成员的指针
原创 2021-07-11 21:51:58 · 85 阅读 · 0 评论 -
C++ 函数重载
原创 2021-07-11 19:02:36 · 72 阅读 · 0 评论 -
C++ 带默认参数值的函数
原创 2021-07-11 18:54:52 · 93 阅读 · 0 评论 -
C++ const修饰符的简单介绍
原创 2021-07-11 18:38:59 · 66 阅读 · 0 评论 -
C++重载运算符小结与注意点
重载运算符需注意:1.重载=运算符时容易忘记写返回值。2.重载赋值运算符时,记得加const3重载时,写在类中的只能有一个参数(实际有两个参数,另外一个是this指针,我们看不见而已),需要两个参数的时候,要写在类外,用友元在类内声明。4.重载递增运算符时,要注意哪个要加引用,哪个不用加引用。//重载前置++运算符 返回引用是为了一直对一个数据进行递增操作 MyInteger &operator++() { //先进行++运算 m_Num++; //再将自身做一个返原创 2021-07-10 20:05:19 · 597 阅读 · 1 评论 -
C++编程基础题训练
1.编写一个c++风格的程序,用动态分配空间的方法计算Fibonacci数列的前20项并存储到动态分配的空间中1.代码如下#include <iostream>using namespace std;int main(){ int *a = new int[25]; a[0] = 0; a[1] = 1; for (int i = 2; i <= 20; i++) { a[i] = a[i - 1] + a[i - 2]; } for (int i = 0;原创 2021-07-10 00:55:54 · 4484 阅读 · 8 评论 -
C++输出对齐(如何使输出对齐)
代码如下:#include <iostream>#include <iomanip>using namespace std;int main(){ cout << setw(15)<<std::left<<"unsigned int" << setw(15) << std::left<<sizeof(unsigned) << endl; cout << setw(15)原创 2021-07-07 00:26:56 · 5894 阅读 · 0 评论 -
C++文本文件操作和二进制文件读写
文本文件操作:代码如下:#include <iostream>#include <fstream>using namespace std;void test01(){ const char *fileName = "C:\\Users\\Tom\\Desktop\\hhh.txt"; //ifstream ism(fileName, ios::in);//只读方式打开文件 ifstream ism; ism.open(fileName, ios::in); c原创 2021-06-13 01:47:39 · 256 阅读 · 1 评论 -
C标准输出流
标准输入流对象cin,重点掌握的函数:cout.flush()//刷新缓冲区cout.put()//向缓冲区写字符cout.write()//二进制流的输出cout.width()//输出格式控制cout.fill()cout.set(标记)cout.flush()代码如下:#include <iostream>using namespace std;void test01(){ cout << "hello world"; cout.flush();原创 2021-06-13 00:57:25 · 768 阅读 · 2 评论 -
C标准输入流
标准输入流对象cin,重点掌握的函数:cin.get()//一次只能读取一个字符cin.get(一次参数)//读一个字符cin.get(两个字符)//可以读字符串cin.getline()cin.ignore()cin.peek()cin.putback()标准输入流cin.get()代码如下:#include <iostream>using namespace std;//标准输入流cin.get()void test01(){ char ch; while原创 2021-06-13 00:39:12 · 443 阅读 · 0 评论 -
C++异常处理分析
C++异常处理基本语法:代码如下:#include <iostream>using namespace std;int divide(int x, int y){ if (y == 0) throw y; return x / y;}void test01(){ //试着去捕获异常 try { divide(10, 0); } /*catch (int) { cout << "除数为0!" << endl; } */ ca原创 2021-06-12 11:24:44 · 169 阅读 · 4 评论 -
C++类模板中的static成员
从类模板实例化的每一个模板类有自己的类模板数据成员,该模板的所有对象共享一个static数据成员。代码如下:#include <iostream>using namespace std;template<typename T>class Person{public: static int a;};template<typename T>int Person<T>:: a = 1;int main(){ Person<原创 2021-06-12 00:03:24 · 234 阅读 · 0 评论 -
C++函数模板机制结论
函数模板机制结论:编译器并不是把函数模板处理成能够处理任何类型的函数函数模板通过具体类型产生不同的函数编译器会对函数模板进行两次编译,在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后的代码进行编译。...原创 2021-06-11 00:09:09 · 130 阅读 · 0 评论 -
c编译过程概述
过程:index.cpp---------------------------------------------------->index.exe#mermaid-svg-ACp6U1xRzIGxhGQ9 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-ACp6U1xRzIGxhGQ9 .label原创 2021-06-10 16:31:07 · 93 阅读 · 0 评论 -
C++函数模板和普通函数的调用规则
C++函数模板和普通函数的调用规则:普通函数可以进行自动类型转换。函数模板必须严格类型匹配。C++编译器优先考虑普通函数。如果函数模板可以产生一个更好的匹配,那么选择模板。可以通过空模板实参列表的语法限定编译器只能通过模板匹配。代码如下:#include <iostream>using namespace std;template<typename T>int myAdd(T a, T b){ cout << "temp原创 2021-06-10 16:12:38 · 150 阅读 · 0 评论 -
C++实现五子棋小游戏
代码如下:#include <iostream>using namespace std;class GoBangDesk{public: GoBangDesk() :state('@'), flagWin(false), flagOver(false), flagDraw(false) { for (int i = 0; i < 20; i++) for (int j = 0; j < 20; j++) goBangDesk[i][j] = '#'原创 2021-06-09 12:05:26 · 177 阅读 · 0 评论 -
C++实现井字棋小游戏(写得不好,留作纪念!!!)
回宿舍路上,同学问起我能不能用C++写个五子棋游戏,我说应该挺简单的,但是我不会写,然后他说不用写五子棋,就写井字棋吧!!!我说试试吧!!!(不过说实话,写得不是很好,留作纪念吧!!!)代码如下:#include <iostream>using namespace std;const int N = 5;bool vis[N][N] = { false };bool tttSon[N][N] = { false };char tttDesk[N][N];int dx[] = {原创 2021-06-04 13:11:08 · 575 阅读 · 8 评论 -
#define与const的区别
一:区别(1)就起作用的阶段而言: #define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。(2)就起作用的方式而言: #define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。(3)就存储方式而言:#define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份;const定义的只读变量在程序运行过程中只有一份备份。(4)从代码调试的方便程度而言: const常量可以进行调试的,d转载 2021-05-19 09:26:56 · 68 阅读 · 0 评论 -
C++ 在派生类中使用using声明改变基类成员的可访问性
通过在类的内部使用using声明语句 , 我们可以将该类的直接或间接基类中的任何可访问成员标记出来 (只限于非私有成员) 。using声明语句中名字的访问权限由该using声明语句之前的访问说明符来决定。例子如下://.hclass Base{public: int base_public = 1; void func1();protected: int base_protect = 2; void func2();private: int base_private = 3; vo原创 2021-05-17 16:56:09 · 711 阅读 · 0 评论 -
C++实现具有[数组]相似特征的类DoubleSubscriptArray
#include <iostream>using namespace std;class DoubleSubscriptArray { public: DoubleSubscriptArray(int x, int y) { p = new int *[x];//行 //申请行的空间 for (int i = 0; i < x; i++) { p[i] = new int [y];//每行的列申请空间 } for (int i = 0; i &.原创 2021-04-18 20:49:51 · 220 阅读 · 0 评论 -
C++ using namespace 命名空间的定义与使用
#include <iostream>using namespace std;namespace A { int x, y; void fun() { cout << "hello world" << endl; }}int main() { using namespace A; cout << x << endl; fun(); return 0;}原创 2021-04-18 20:18:37 · 267 阅读 · 0 评论 -
计算成绩-二维数组指针(指向二维数组的指针)应用
题目:要求自定义函数且函数的形式参数为行指针变量:有一个10行5列的浮点型数组,用来存放10个学生5门课程的成绩,还有一个用来记录每个学生平均成绩的一维数组。要求定义函数来实现计算每个学生的平均成绩。学生各门成绩的输入和平均成绩的输出要求在主函数中完成。代码如下:#include <iostream>using namespace std;const int N = 5;double a[10][N];double ave[10];void mathgrade(d原创 2021-04-19 16:11:10 · 663 阅读 · 0 评论 -
C++substr()用法
substr()用法:string 需要截取的字符串a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取)b 要截取的字符串的长度注意:第3个参数是要截取字符串的长度原创 2021-04-11 20:36:02 · 199 阅读 · 0 评论 -
C++关于getline()和getchar()的小点
getchar只能“吃”一个字符,而getline可以“吃”一行字符代码如下:#include <iostream>#include <cstring>using namespace std;int main(){ char c; cin>>c; string line; getline(cin,line); cout<<c<<endl; cout<<line<<endl; return 0;}原创 2021-04-11 20:05:10 · 742 阅读 · 0 评论 -
2.5w字长文爆肝 C++动态内存与智能指针一篇搞懂!太顶了!!!
动态内存动态内存与智能指针shared_ptr类make_shared函数三种内存区别:静态存储区主要存放static静态变量、全局变量、常量。这些数据内存在编译的时候就已经为他们分配好了内存,生命周期是整个程序从运行到结束。栈区存放局部变量。在执行函数的时候(包括main这样的函数),函数内的局部变量的存储单元会在栈上创建,函数执行完自动释放,生命周期是从该函数的开始执行到结束。线性结构。堆区(存储动态分配的对象)程序员自己申请的任意大小的内存。一直存在直到被释放。链表结构。动态内存与原创 2021-04-09 20:40:22 · 3736 阅读 · 35 评论 -
C++拷贝构造函数调用时机分析
让我们来分析下面这段代码:#include <iostream>#include <string>using namespace std;class Employee { private: static int sn; public: Employee() { cout << "Employee()" << endl; mysn = sn++; } Employee(const string &s) {原创 2021-04-06 20:32:44 · 237 阅读 · 3 评论 -
C++分析使用拷贝控制成员和调用构造函数的时机
我们来分析下面这段代码:#include <iostream>#include <vector>using namespace std;struct X { X() { cout << "构造函数X()" << endl; } X(const X &) { cout << "拷贝构造函数X(const X&)" << endl; } X &operator=(const X &原创 2021-04-06 00:25:22 · 116 阅读 · 0 评论 -
C++未定义行为-数组越界
我们先来看看下面的代码:#include <iostream>using namespace std;const int N = 100010;int a[N];int main(){ for (int i = 1;i<=N;i++) a[i] = 2; return 0;}当我们写这段代码的时候,编译器就会发生这样的问题。这是为什么呢???其实是发生了数组越界。a[n]里面能装n个数,可这是从0开始装的,当我们从1开始装的时候,最大的数组下标是n-1,可上面原创 2021-04-01 23:06:46 · 328 阅读 · 0 评论