
C++
文章平均质量分 65
JasonLiu1919
微信公众号《小窗幽记机器学习》。却顾所来径,苍苍横翠微。个人微信号:onepieceand
展开
-
【模型推理加速系列】05: 推理加速格式TorchScript简介及其应用
本文主要介绍TorchScript的基本概念及其在 C++ 中的使用原创 2022-11-22 22:30:21 · 1600 阅读 · 0 评论 -
gdb时候遇到的奇怪问题(关于返回值)
背景在gdb一段代码的时候,发现在执行n的时候,并没有按照预期进行执行,而是运行到另一行代码中。而该行代码是在整体的代码逻辑中由于条件不满足是不可能进入的。 代码框架如下:if(条件1) { 处理1 if(条件2) { 处理2 if(条件3) {原创 2017-03-16 15:57:28 · 834 阅读 · 0 评论 -
多线程编程-通过fork方式创建任务进程
背景在多进程中需要创建一个任务进程进行待处理任务的分发工作。也就是说,需要在主进程中detach剥离出一个进程,且该子进程独立于主进程,进行独立的任务发送。如果是单纯在主进程中fork一个子进程的话,如果进行了wait等待操作,那么该任务进程就失去了独立性,无法实现边取任务边分发任务。而如果是不进行wait等待操作的话,那么子进程可能也会执行后续创建多个处理任务的进程,使得出现的并行进程数量为预期的原创 2017-03-07 16:02:11 · 831 阅读 · 0 评论 -
leveldb安装和使用
安装:进入git clone下来的项目中 make 此时leveldb/下多出out-shared和out-static目录,其中out-shared/下有: db db_bench helpers libleveldb.so libleveldb.so.1 libleveldb.so.1.19 port table util等文件 然后执行: sudo cp out-原创 2017-03-10 16:07:52 · 4470 阅读 · 1 评论 -
Map的插入操作和按照value排序
背景对比map的插入操作效率说明常见的map插入操作有两种,一种是通过操作符[]进行插入,另一种则是通过insert成员函数进行插入。 []操作符进行插入。[]操作符示例:std::map<int,string> map1;map1[2]="Hello";插入2时,先在map1中查找主键为2的项,没发现,然后将一个新的对象插入map1中,键是2,此时的值是一个空字符串,在插入完成后,将字符串赋为原创 2016-06-02 10:04:41 · 6960 阅读 · 0 评论 -
疑问拾遗
背景:在使用迭代器访问map的时候,gdb打印不出对应的成员 需要先将it->second的值赋给一个临时变量,再通过该变量进行访问。 上图中的tmp1值为Sequence tmp1 = it->second;HashMap<Sequence, Sequence, word_hash> :: const_iterator it = myword.find(input);如果直接访问it->原创 2017-02-05 16:25:01 · 505 阅读 · 0 评论 -
浮点型数组输出
背景: 将一个float数组数据进行输出,保留为一个文本内容,方便其他人查看。 方式1: float signala[1024] .....存放数据到signala中 //将signala数据写到磁盘中,此时写出的是float,所以直接用编辑器打开的话,会是乱码的。 FILE *file1; file1 = fopen("result_a.txt", "w"原创 2016-11-18 21:28:47 · 12379 阅读 · 0 评论 -
多线程的文件读写操作讨论
背景:对于13GB大小的文件,逐行读取,后写到一个新文件。单个线程,进行耗时242s。这里的处理操作比较简单,仅仅是直接写到一个新的文件。如果处理操作耗时越长,多线程的优点越能够显现出来。采用多线程:比如创建5个线程,进行。如果读用一个锁,写再用一个锁的话,耗时649s。如果读写用相同一个锁的话,耗时608。两者差别不太。发现是因为写操作选择不合理,该操作,要进行等待,将时原创 2016-01-08 11:30:14 · 13125 阅读 · 11 评论 -
多线程编程-detach
背景线程1中获取任务之后,需要做长时间的处理,但是线程1不能够长时间等待,需要在获取完任务之后,就反馈信息。方案设计:线程1在接受任务之后,新建一个线程,并调用detcha(),使该线程分离,允许独立运行。 代码://新建一个线程的方式,用于处理其他任务void sayhello(){ //模拟线程处理任务 sleep(30); std::cout<<"son thre原创 2016-08-09 14:18:32 · 838 阅读 · 0 评论 -
多线程编程学习笔记-海量数据求和
背景任务数量大约100W,如果在一个线程下跑的话,巨耗时,所以考虑,在主线程下,创建多线程的方式,并行进行海量任务的处理。本文以多次循环求和作为例子。单线程:int main(){boost::posix_time::ptime start =boost::posix_time::microsec_clock::local_time();uint64_t result = 0;for (in原创 2016-08-12 11:00:14 · 1655 阅读 · 0 评论 -
数据拷贝整理
背景:数据拷贝和转换上的整理。char数组之间拷贝strcpy原型:char *strcpy(char *dest, char *src); 功能:把src所指由‘\0’结束的字符串复制到dest所指的数组中。 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。 注意:当src串长度>dest串长度时,程序仍会将整个src串原创 2016-08-05 16:28:46 · 839 阅读 · 0 评论 -
Mysql批量操作整理
背景面对批量频繁的数据库操作,本文尝试从经验整理mysql批量查询,插入等操作的方法批量查询情景1:查询同个字段多个值采用方法: 采用In方式。返回的结果顺序对应In中值的顺序。这种同一字段不同值,采用In方式可以避免多次的任务提交。当然,也可以通过任务的START TRANSACTION和COMMIT方式将多个select语句一次性进行提交。这种事务命令可以用以一序列的数据库操作。原创 2016-07-23 16:30:17 · 2718 阅读 · 0 评论 -
获取某个目录下的文件名称
背景:对于给定的目录,获取该目录下面的文件,不包括文件夹。为了方便在没有给定目录文件清单的情况下对该目录下的文件进行操作,增加该需求方案:采用readdir进行获取代码: string srcDir = "."; string desDir = ""; vector<string> files; DIR *dir; struct dirent原创 2016-04-17 17:00:10 · 670 阅读 · 1 评论 -
C++中采用正则方式获取目录下文件的规范名字
背景:获取目录下的文件名,但是由于文件名命名不规范统一,需要从文件名中提取出特定的信息作为该文件名的新名称,以实现文件的重命名。分析:1:采用readdir来获取目录下文件 2:采用regexec对文件名进行正则匹配,获取文件名中的hash信息作为该文件的新名称 3:注意旧文件名中由于hash只是文件名的一部分,可能存在相同hash信息,需要对此做处理。代码: string hashfil原创 2017-03-21 11:20:09 · 1488 阅读 · 0 评论 -
C++知识点整理
1:函数中参数缺省问题 函数声明部分:void mytest(std::string &hash, float &Deviation, std::vector<std::string> reference=std::vector<std::string> ());注意在定义部分是没有给缺省值! 函数定义部分:mytest(std::string &hash, float &Deviation,原创 2017-03-08 21:16:06 · 509 阅读 · 0 评论 -
多进程下的文件写操作
背景:进行多进程处理过程中,对处理结果写到结果文件中。问题描述:如果不采用锁或者其他进程同步的方式的话,如下代码:void process_filelock_nonelock(){ int x=0;//如果操作的变量不是进程共享的话,那么就各自操作自己的x,不会相互影响。一个进程累计结果为20,另一个进程累计结果为40 int rt; //尚未采...原创 2018-02-08 17:47:12 · 2149 阅读 · 0 评论 -
std::vector<string>转string
背景:将vector<string> 在不经过for遍历的前提下转为一个字符串。 方案1: 采用accumulate函数#include <vector>#include <string>#include <numeric>#include <iostream>int main(){ std::string lastdata; std::vector<std::stri原创 2017-09-16 12:41:33 · 21051 阅读 · 0 评论 -
由一个C++问题引发的讨论和思考(未完待续)
背景:class Test{ private: int a; public: void f() { std::cout<<"HelloWorld"<<std::endl;// } void f1() { std::cout<<"a="<<a原创 2017-09-22 09:05:22 · 389 阅读 · 0 评论 -
vector<string>转为vector<int>
背景:想要快速简单明了地将vector<string>转为vector<int>方案:采用std::transform函数 代码:int ToInt(const string &str){ return atoi(str.c_str()); //将String类型转成int类型}int main(){ std::vector<std::string> vecs; vecs原创 2017-08-21 15:16:21 · 5635 阅读 · 0 评论 -
字典树的序列化和反序列化
背景:对于给定的一序列单词,在重建一棵字典树之后,将该树进行保留,实现进程之间的数据共享。方案设计1:常见的是采用struct或者class,作为节点信息和父子关系信息的存储。在子节点设计的时候采用指针数组的方式。代码:#include<cstdio>#define MARKER ')'#define N 26using namespace std;// A node of N-ary tr原创 2017-07-31 21:32:34 · 1108 阅读 · 0 评论 -
网易2018校招内推笔试-交错01串
题目:如果一个01串任意两个相邻位置的字符都是不一样的,我们就叫这个01串为交错01串。例如: “1”,”10101”,”0101010”都是交错01串。 小易现在有一个01串s,小易想找出一个最长的连续子串,并且这个子串是一个交错01串。小易需要你帮帮忙求出最长的这样的子串的长度是多少。 输入描述:输入包括字符串s,s的长度length(1 ≤ length ≤ 50),字符串中只包含’0’和’原创 2017-08-13 14:45:09 · 1581 阅读 · 0 评论 -
网易2018校招内推笔试-彩色砖块
题目:小易有一些彩色的砖块。每种颜色由一个大写字母表示。各个颜色砖块看起来都完全一样。现在有一个给定的字符串s,s中每个字符代表小易的某个砖块的颜色。小易想把他所有的砖块排成一行。如果最多存在一对不同颜色的相邻砖块,那么这行砖块就很漂亮的。请你帮助小易计算有多少种方式将他所有砖块排成漂亮的一行。(如果两种方式所对应的砖块颜色序列是相同的,那么认为这两种方式是一样的。) 例如: s = “ABAB”原创 2017-08-13 13:56:09 · 1376 阅读 · 0 评论 -
strncpy拷贝问题而引发的一些讨论
背景:对一块string对象进行拷贝到char数组的时候发现数据缺失了。分析:由于在拷贝的时候使用的是strncpy,而strncpy在复制的时候,在遇到’\0’时,先复制过去,然后的把dest剩下置为了0。所以,一旦源字符串中存在\0则会导致源数据被截断。为此我们可以采用memcpy进行拷贝操作(snprintf 拷贝的时候遇到\0 也会停止)。各个拷贝函数的比较:strncpy:strncpy比原创 2017-06-23 20:45:51 · 13589 阅读 · 2 评论 -
C11编辑器升级和C11标准使用
背景C11中的一些特性需要对应的编译器才能支持。而有些系统默认的编译器并不支持C11,所以需要4.8及其以上的版本。编译器升级原GCC版本:4.4.7; 目标:升级GCC到4.8.2,以支持C++11。 1)获取GCC 4.8.2包:wget http://gcc.skazkaforyou.com/releases/gcc-4.8.2/gcc-4.8.2.tar.gz; 2)解压缩:tar -原创 2017-04-25 20:15:04 · 5761 阅读 · 1 评论 -
cpp文件定义和使用中出现的multiple definition of报错
背景:在一个A.cpp文件中定义了一些class和一些普通函数。在B.cpp文件中对A.cpp进行了include操作。报错:tmp/ccyTkYe4.o: In function `TestDualLingualUpload()':/data1/workspace/liujiepeng/kg/LyricsCxx/testUtil/TestDualLingualUpload.cpp:555: mu原创 2017-05-16 16:28:29 · 2009 阅读 · 0 评论 -
boost中unorder_set使用
背景遍历一个大文件中行数据,将有版权的信息和无版权的信息按照name1+name2这个组合关键字分开,分别记为集合Set1和Set2。如果无版权信息name1+name2信息集合(Set2)中出现在Set1中则将该关键字对应的数据从该Set1集合中删除,即视为该关键字name1+name2是有版权的。方案分析:逐行遍历,将每行有版权和无版权的信息分别存放于unordered_set 中的set1和s原创 2017-04-14 16:01:52 · 1785 阅读 · 0 评论 -
C++学习笔记:回调函数使用
1、背景介绍:回调函数其实就是一个通过函数指针调用的函数!假如你把A函数的指针当作参数传给B函数,然后在B函数中通过A函数传进来的这个指针调用A函数,那么这就是回调机制。A函数就是回调函数,而通常情况下,A函数是系统在符合你设定条件的情况下会自动执行,比如Windows下的消息触发等等。那么调用者和被调用者的关系就被拉开了,就像是中断处理函数那样。函数指针是一个指针,只是这个指针它不像普通原创 2015-09-10 16:28:44 · 620 阅读 · 0 评论 -
一次性将文件从磁盘中读取到指定变量
方法1:读取至std::string代码1:istreambuf_iterator#include <string>#include <fstream>#include <streambuf>std::ifstream t("file.txt");std::string str((std::istreambuf_iterator<char>(t)), std:原创 2016-03-18 17:49:04 · 671 阅读 · 0 评论 -
STL使用:deque双端队列
双端队列deque支持两端的插入和删除操作。由于它是动态地以分段连续空间组合而成的,所以没有容量(capacity)的概念,可以随时增加一段新的空间并链接起来。deque不会像vector那样因为旧空间不足而重新配置一块更大的空间,然后再复制元素,再释放旧空间。因此,deque也就没有必要提供所谓的空间保留(reserve)功能。1)支持随即存取。2)支持两端操作,push(pop)-原创 2015-08-19 21:42:21 · 1955 阅读 · 0 评论 -
华为OJ:字符逆序和单词翻转
将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字符。 如:输入“I am a student”,输出“tneduts a ma I”。 输入参数:inputString:输入的字符串 返回值:输出转换好的逆序字符串需要注意的是,该题和单词翻转之间的区别!单词翻转输入“I am a student.”,则输出“student.a am I”。1:字符逆序原创 2015-08-05 21:09:44 · 2436 阅读 · 0 评论 -
华为OJ:统计每个月兔子的总数
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? /** * 统计出兔子总数。 * * @param monthCount 第几个月 * @return 兔子总数 */ public static int getTotalCou原创 2015-07-21 21:29:12 · 1584 阅读 · 0 评论 -
C++学习笔记:volatile的作用
1、volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。用volatile关键字声明的变量i每一次被访问时,执行部件都会从i相应的内存单元中取出i的值。没有用volatile关键字声明的变量i在被访问的时候可能直接原创 2015-08-28 12:12:06 · 835 阅读 · 0 评论 -
华为OJ:输出单向链表中倒数第k个结点
#include using namespace std;typedef struct node{ int a;//编号 int b;//测量值 struct node *next;}node,*linklist;//为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。//可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针。//在遍历时维持两原创 2015-07-21 15:23:05 · 2332 阅读 · 0 评论 -
华为OJ:线性插值
信号测量的结果包括测量编号和测量值。存在信号测量结果丢弃及测量结果重复的情况。 1.测量编号不连续的情况,认为是测量结果丢弃。对应测量结果丢弃的情况,需要进行插值操作以更准确的评估信号。 采用简化的一阶插值方法,由丢失的测量结果两头的测量值算出两者中间的丢失值。 假设第M个测量结果的测量值为A,第N个测量结果的测量值为B。则需要进行(N-M-1)个测量结果的插值处理。进行一阶线性插原创 2015-07-19 18:01:39 · 1884 阅读 · 0 评论 -
华为OJ:从单向链表中删除指定值的节点
输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};详细描述:本题为考察链表的插入和删除知识。链表的值不能重复构造过程,例如1 -> 23 -> 25原创 2015-07-12 16:50:09 · 5222 阅读 · 1 评论 -
两个字符串合并、排序和转换
按照指定规则对输入的字符串进行处理。详细描述:将输入的两个字符串合并。对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标意思是字符在字符串中的位置。对排训后的字符串进行操作,如果字符为‘0’——‘9’或者‘A’——‘F’或者‘a’——‘f’,则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符。如字符原创 2015-07-11 16:59:46 · 6064 阅读 · 0 评论 -
C语言内存地址基础(ZZ)
从计算机内存的角度思考C语言中的一切东东,是挺有帮助的。我们可以把计算机内存想象成一个字节数组,内存中每一个地址表示 1 字节。比方说我们的电脑有 4K 内存,那这个内存数组将会有 4096 个元素。当我们谈论一个存储地址的指针时,就当相于我们在谈论一个存储着该内存数组某个元素索引的指针。逆向引用某个指针,将会得到数组中该索引所指向的值。这一切当然都是谎言。操作系统对内存的管理要远比这复杂。内存不转载 2015-04-01 09:51:18 · 988 阅读 · 1 评论 -
给定整形数组A和目标整数t,A相邻元素差绝对值为1,请找到t在A中的位置
http://blog.youkuaiyun.com/morewindows/article/details/10645269题目:有这样一个数组A,大小为n,相邻元素差的绝对值都是1。如:A={4,5,6,5,6,7,8,9,10,9}。 现在,给定A和目标整数t,请找到t在A中的位置。除了依次遍历,还有更好的方法么?数组第一个数为array[0],要找的数为y,设t = abs(y - a转载 2015-01-12 21:12:58 · 1354 阅读 · 1 评论 -
基于动态规划的矩阵连乘最优方法
问题描述:在科学计算中经常要计算矩阵的乘积。矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p×q的矩阵,B是一个q×r的矩阵,则其乘积C=AB是一个p×r的矩阵。其标准计算公式为:由该公式知计算C=AB总共需要pqr次的数乘。 为了说明在计算矩阵连乘积时加括号方式对整个计算量的影响,我们来看一个计算3个矩阵{A1,A2,A3}的连乘积的例子。设这3个矩阵的维数分别为10原创 2015-01-12 19:35:54 · 13162 阅读 · 5 评论 -
VS下头文件使用注意事项
1、防止循环包含A.h中写#include "B.h"在A.h中可以直接定义类B的对象;比如 B m_b;而在B.h中不能直接写#include "A.h"应该写class A;//声明B是一个外部类。这个必须要用,不能只用#include "A.h",如果只是#include "A.h"而没有class A;则会报错.Class B{A *pA;//声明一原创 2015-08-20 11:44:54 · 1195 阅读 · 0 评论