
C/C++
嘉木空青
工科硕士,从事信号处理,数据分析,人工智能算法研究。19年入职场,现从事机器学习工作。
展开
-
malloc/free与new/delete的区别
malloc/free是C++/C的标准库函数,new/delete是C++的运算符对于非内部数据类型的对象而言,对象创建的同时会自动执行构造函数,在消亡之前要自动调用析构函数。但由于malloc/free是库函数,不在编译器的控制范围内,不能够执行构造函数和析构函数。此时,C++需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理和释放内存工作的运算符delete。...原创 2018-09-21 10:36:05 · 211 阅读 · 0 评论 -
C++面向对象知识点三:拷贝构造函数
拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于: 通过使用另一个同类型的对象来初始化新创建的对象。 复制对象把它作为参数传递给函数。 复制对象,并从函数返回这个对象。 如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。拷贝构造...原创 2018-08-25 22:21:46 · 314 阅读 · 0 评论 -
C++中的几个输入函数:cin,cin.get(),getline(),cin.getline() 的区别
目录cin>>cin.get()getline()cin.getline()cin>>属于istream流1)用于输入数字。#include <iostream>using namespace std;int main(){ int a, b; cin >> a >> b; ...原创 2018-08-29 22:33:40 · 489 阅读 · 0 评论 -
C++面向对象知识点二:构造函数与析构函数
目录类的构造函数类的析构函数调用构造函数和析构函数的时机(对象的生存周期)缺省构造函数与缺省析构函数类的构造函数功能:在创建类的新对象时,由系统自动调用,用给定的值对数据成员初始化 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回void 构造函数可以重载 一般将构造函数定义为公有成员函数 不可以通过对象名调用构造函数,即的d1.Date...原创 2018-08-25 21:57:19 · 1069 阅读 · 0 评论 -
C++:计算字符串最后一个单词的长度,单词以空格隔开。
C++:使用string类 输入使用:#include <iostream>#include <string>using namespace std;string s;getline(cin, s);#include <string>#include <iostream>using namespace std;int...原创 2018-08-29 20:03:22 · 1793 阅读 · 0 评论 -
C++:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5struct ListNode{ int val; struct ListNode *next; ListNode(int x): val(x), ne...原创 2018-08-29 19:07:52 · 1056 阅读 · 0 评论 -
最长递增子序列详解(longest increasing subsequence)
对于动态规划问题,往往存在递推解决方法,这个问题也不例外。要求长度为i的序列的Ai{a1,a2,……,ai}最长递增子序列,需要先求出序列Ai-1{a1,a2,……,ai-1}中以各元素(a1,a2,……,ai-1)作为最大元素的最长递增序列,然后把所有这些递增序列与ai比较,如果某个长度为m序列的末尾元素aj(j<i)比ai要小,则将元素ai加入这个递增子序列,得到一个新的长度为m+1的新...转载 2018-09-04 11:03:37 · 1084 阅读 · 0 评论 -
排序算法的效率
目录冒泡排序快速排序选择排序堆排序插入排序希尔排序合并排序稳定排序的概念对于大小为n的排序数据量:冒泡排序https://blog.youkuaiyun.com/Doutd_y/article/details/81911362计算复杂度:平均速度为,最坏情况下的速度为快速排序与冒泡排序类似,也是基于交换排序的思想。https://blog.csdn.ne...原创 2018-08-25 11:52:55 · 378 阅读 · 0 评论 -
华为OJ:给定n个字符串,请对n个字符串按照字典序排列。
#include <iostream>#include <map>#include <string>using namespace std;int main(){ int n; cin >> n; string s; map<string, int> s_set; int k = n; for (; k >=...原创 2018-08-31 22:03:56 · 1518 阅读 · 0 评论 -
内存泄漏与内存溢出
目录内存溢出内存泄露如何避免内存泄漏内存溢出out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出!比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退...原创 2018-08-31 18:27:36 · 159 阅读 · 0 评论 -
malloc()函数的使用
C语言中malloc是动态内存分配函数。函数原型:void *malloc(unsigned int num_bytes);参数:num_bytes 是无符号整型,用于表示分配的字节数。返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存...原创 2018-08-31 18:19:59 · 478 阅读 · 0 评论 -
华为OJ:输入一个整数,将这个整数以字符串的形式逆序输出 程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
#include <iostream>using namespace std;int main(){ int n; cin >> n; int i = 0,t = n; while (t>0) { t = t / 10; i++; } char *s = (char*)malloc(sizeof(char) * ...原创 2018-08-31 18:00:35 · 1491 阅读 · 0 评论 -
C++STL(标准模板库)之关联容器:set
setset集合是c++ STL库中自带的一个容器,set具有以下两个特点:set中的元素都是排好序的 set集合中没有重复的元素set的各成员函数列表如下:1. begin()--返回指向第一个元素的迭代器2. clear()--清除所有元素3. count()--返回某个值元素的个数4. empty()--如果集合为空,返回true5. end()--返回指向最...原创 2018-08-31 15:45:07 · 520 阅读 · 0 评论 -
C++STL(标准模板库)之容器
容器在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对象的对象。容器的优势:它不需要预先知道要存储多少对象,只要创建一个容器对象,并合理的调用它所提供的方法,所有的处理细节将由容器来自身完成。STL定义的通用容器分为三类:顺序容器,关联式容器,容器适配器。顺序容器一种各元素之间有顺序...原创 2018-08-31 15:45:32 · 208 阅读 · 0 评论 -
二叉树的最小深度(C/C++)
用递归去实现:struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode (int x): val(x), left(NULL), right(NULL) {}};int func(TreeNode *root){ if(root == NULL) r...原创 2018-08-21 15:40:27 · 1092 阅读 · 0 评论 -
C++STL(标准模板库)之顺序容器:vector
向量vector是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组。std::vector::eraseiterator erase (const_iterator position);iterator erase (const_iterator first, const_iterato...原创 2018-08-31 15:39:17 · 628 阅读 · 0 评论 -
基于数组的归并排序--递归与非递归法(C++/C)
目录递归法非递归法思想:分而治之:参考网上其他的示意图递归法自顶向下归并排序是建立在归并操作上的一种时间复杂度为,空间复杂度为有效排序算法,思想是分而治之。// 归并排序_递归.cpp: // 以数组为例子#include "stdafx.h"#include<iostream>using namespace std;// 在原始数组...原创 2018-08-24 11:27:37 · 1372 阅读 · 0 评论 -
C++:string类型、char *类型,int类型之间的转换:atoi(),stoi(),c_str()
目录s.c_str():atoi()函数stoi()函数#include <iostream>#include <vector>#include <string>using namespace std;int main(){ const char *chs; string s = "12345678"; ...原创 2018-09-02 19:19:50 · 1826 阅读 · 0 评论 -
C++:using namespace std;
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。所谓namespace,是指标识符的各种可见范围。 由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:直接指定标识符例如std::iostream而不是iostream。完整语句如下: 1 std::cout<<std::hex<&...原创 2018-09-02 19:07:33 · 437 阅读 · 0 评论 -
C++/C中堆和栈的区别
内存分配栈区:由编译器自动分配释放,存放函数的参数值,局部变量的值等;其操作方式类似于数据结构中的栈。堆区:一般由程序员分配和释放,若程序员不释放,程序结束时可能由OS回收,这与数据结构中的堆完全不是一个概念,分配方式类似于链表,一般堆的头部用一个字节存放堆的大小,堆中的具体内容由程序员安排。全局区(静态区):全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域,...原创 2018-09-21 10:46:56 · 225 阅读 · 0 评论 -
LeetCode:二叉树的中序遍历(递归与非递归法)
二叉树结点类:struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x): val(x), left(NULL), right(NULL) {}};递归法: class Solution{public: void inOrder(TreeNod...原创 2018-09-14 21:29:46 · 1005 阅读 · 0 评论 -
LeetCode:二叉树的前序遍历(递归与非递归法)
二叉树结点类:struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x): val(x), left(NULL), right(NULL) {}};递归法: class Solution{public: void preOrder(TreeNo...原创 2018-09-14 17:43:21 · 661 阅读 · 0 评论 -
LeetCode:二叉树的后序遍历(递归与非递归法)
二叉树结点类:struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x): val(x), left(NULL), right(NULL) {}};递归法: class Solution{public: void postOrder(Tr...原创 2018-09-14 17:35:11 · 795 阅读 · 0 评论 -
动态申请一维/二维数组
int N = 10;int M = 10;int *a;a = (int *) malloc(sizeof(int)*N);int **aa;aa = (int **) malloc(sizeof(int*)*N);for(int i=0; i<N; i++){ aa[i] = (int *)malloc(sizeof(int)*M);}原创 2018-09-07 16:39:20 · 291 阅读 · 0 评论 -
编程:0交换排序
长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的交换,以完成排序。#include <string>#include <iostream>using namespace std;void swap_with_zero(int *array, int len, int n){ int zIndex = -1; int nIndex = -1;...原创 2018-09-07 14:08:05 · 1895 阅读 · 0 评论 -
华为OJ:字符串应用-密码截获
我个人觉得,这个问题的题目说的太垃圾了,十分不详细,很容易让人误解。之前一直编译不通过,也未知其原因,在参考通过的程序之后,才get到该题目的意思,难道我语文不好?maybe。根据程序,可以知道,该题目主要是判断两种情况的对称字符串的长度,一种是偶对称,如 ABCCBA,最大长度为6,字符串123321->51233214也属于此类,最大长度不是12,而是6。。。;另一种是奇对称,如...原创 2018-09-07 10:47:38 · 360 阅读 · 0 评论 -
#define 与 typedef
#define 用于指定标识符来代替一个字符串、表达式或数值常量,也称为宏定义。标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”都用宏定义中的对象(字符串、表达式、数值常量)去替换,称为宏展开或宏替换。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。生命周期止于编译期。 typedeftypedef 的主要应用有如下的几种形式:1) 为基...原创 2018-09-17 17:32:33 · 238 阅读 · 0 评论 -
基于数组的归并排序--递归法(C++/C)
void mergeTwoArray(int *a, int left, int mid, int right, int *temp){ int i = left; int j = mid + 1; int t = 0; while (i <= mid && j <= right) { if (a[i] <= a[j]) temp[t++]...原创 2018-09-16 09:08:45 · 776 阅读 · 0 评论 -
C++:string 与 char *,char[ ] 的互相转换
1、string 转 char *data()string s = "asdfr";const char *c = s.data();c_str()string s = "asdfr";const char *cc = s.c_str();2、string 转 char [ ]copy()string s = "asdfr";char cc[50];s.copy...原创 2018-09-06 17:08:36 · 451 阅读 · 0 评论 -
华为OJ:字符串加解密
题目描述1、对输入的字符串进行加解密,并输出。2加密方法为:当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;其他字符不做变化。3、解密方法为加密的逆过程。 接口描述: 实现接口,每个接口实现1个基本操作: void Encrypt...原创 2018-09-05 22:38:39 · 262 阅读 · 0 评论 -
华为OJ:开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
用到了类string的length(), size(),find_first_of(),find_last_of(),substr(),push_back()函数 #include <iostream>#include <algorithm>#include <vector>#include <string>using namespac...原创 2018-09-03 11:13:37 · 1705 阅读 · 1 评论 -
C++:string类的使用方法
size()、length()、capacity(): #include <iostream>#include <string>using namespace std;int main(){ string s("test string"); // size()和length()的作用一样,返回当前字符串s的长度 cout <&l...原创 2018-09-03 10:16:38 · 242 阅读 · 0 评论 -
华为OJ:查找兄弟单词
输入描述:先输入字典中单词的个数,再输入n个单词作为字典单词。输入一个单词,查找其在字典中兄弟单词的个数再输入数字n输出描述:根据输入,输出 查找到的兄弟单词的个数及#include <iostream>#include <string>#include <set>#include <vector>#i...原创 2018-09-05 15:45:15 · 554 阅读 · 0 评论 -
华为OJ:合唱队
最长递增子序列的变种:https://blog.youkuaiyun.com/Doutd_y/article/details/82380287#include <iostream>#include <string>#include <vector>using namespace std;#define Max(x,y) ((x)>(y) ? (x) :...原创 2018-09-05 13:40:04 · 272 阅读 · 0 评论 -
华为OJ:字符串排序
采用冒泡排序(稳定排序):法1: 遇到非字母字符时,处理要小心。#include<iostream>#include<string>using namespace std;int main(){ string s,str; char tempc; while(getline(cin,str)) { int...原创 2018-09-05 13:36:59 · 432 阅读 · 0 评论 -
两个有序数组的合并--非递归(C++/C)
以从小到大排序为例:思路:每次比较两个数组的第一个数,取较小的那一个,取完之后将该数从对应数组中删除,然后继续比较,如果某一数组为空,则直接将另外一个数组的元素依次复制到新的合并数组中即可。#include <iostream>using namespace std;void mergeTwoArray(int *a, int n, int *b, int m, int ...原创 2018-08-09 22:20:48 · 765 阅读 · 0 评论 -
两个有序链表的合并--递归与非递归(C/C++)
目录链表类非递归法递归法主函数调用链表类// 链表类:struct ListNode{ int val; ListNode *next; ListNode (int x): val(x), next(NULL) {}};非递归法// 合并两个有序链表:ListNode *mergeTwoLists(ListNode *l1, Lis...原创 2018-08-09 22:28:51 · 3322 阅读 · 0 评论 -
基于数组的二分查找法--递归与非递归(C++/C)
目录概述非递归法递归法主函数概述折半查找:时间复杂度:,空间复杂度:元素存储在数组中;有序排列。 非递归法int binarySearch(const int arr[], int search_val, int low, int high){ while (low <= high) { int middle ...原创 2018-08-09 23:53:19 · 942 阅读 · 0 评论 -
Shell排序与插入排序算法
目录基于链表的插入排序基于数组的插入排序基于数组的Shell排序基于链表的插入排序https://blog.youkuaiyun.com/Doutd_y/article/details/81557320ListNode * InsertionSort(ListNode *head){ if (head == NULL) return 0; ListN...原创 2018-08-22 21:31:32 · 359 阅读 · 0 评论 -
C++面向对象知识点四:友元函数
友元在类的非成员函数中多次调用类的公有函数接口访问私有数据成员时,程序执行时间开销会变大。此时将非成员函数定义为类的友元函数便可直接访问类的私有的或保护的数据成员。使用友元函数的目的是提高程序的执行效率,但友元函数破坏了类的信息隐蔽性,慎用。 类的友元函数定义在类外部,但有权访问类的所有私有成员和保护成员。 友元函数不是类的成员函数,对友元函数指定访问权限无效。 友元可以是一个函数(...原创 2018-08-26 20:26:14 · 574 阅读 · 0 评论