C/C++
文章平均质量分 64
taolusi
联系方式:taolusi@163.com,一般不太看评论,欢迎来信交流。
展开
-
练习3-1 在上面有关折半查找函数中,while循环语句内共执行了两次测试,其实只要一次就足够(代价是将更多的测试在循环外执行)。重写该函数,使得在循环内部只执行一次测试。比较两种版本函数的运行时间。
这个题先上代码吧,然后再说一下几个点,折半查找就不作解释了。参考代码:#include#includeint binsearch_b(int x, int v[], int n){ int low, high, mid; low = 0; high = n - 1; while(low <= high) { mid =原创 2016-09-09 11:33:38 · 3314 阅读 · 1 评论 -
main函数的参数int argc和char **argv
转自:Eastmountmain()函数参数通常我们在写主函数时都是void main()或int main() {..return 0;},但ANSI-C(美国国家标准协会,C的第一个标准ANSI发布)在C89/C99中main()函数主要形式为:(1).int main(void)(2).int main(int argc,char *argv[]) = int main(int arg...转载 2018-07-02 16:06:00 · 302 阅读 · 0 评论 -
C++ boost::program_options用法
转自:morning_color简介program options是一系列pair<name,value>组成的选项列表,它允许程序通过命令行或配置文件来读取这些参数选项.主要组件program_options的使用主要通过下面三个组件完成:组件名 作用 options_description(选项描述器) 描述当前的程序定义了哪些选项 pa...转载 2018-07-11 14:47:00 · 990 阅读 · 0 评论 -
C++ gdb调试
cmake和gdb调试程序由于出发点是想要在cmake后使用gdb,因此先写一下cmake和gdb的简单的一个流程,此部分转自:WELEN1. cmake支持gdb的实现,首先在CMakeLists.txt下加入SET(CMAKE_BUILD_TYPE "Debug") 在下面加入:SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wa...转载 2018-07-11 10:49:00 · 12990 阅读 · 0 评论 -
gdb调试中出现optimized out
转自:上善若水问题print变量中出现<optimized out>。解决添加编译选项-O0,意思是不进行编译优化,gdb在默认情况下会使用-O2。使用-O0选项调试的时候就会顺畅了,发布项目的时候不用再使用 -O0参数项,gcc 默认编译或加上-O2优化编译会提高程序运行速度。在muduo源码中使用-O2选项,调试的时候对其Makefile进行修改即可。 ...转载 2018-07-11 10:30:00 · 3928 阅读 · 0 评论 -
CMake生成的可执行文件能够gdb调试
转自:欣宇专栏,漫游学海之旅一般在调用./configure时,可以通过设置CXXFLAGS或者CFLAGS使程序可以支持调试,就是可以用GDB查看程序运行的信息,但在cmake编译时,在cmake过程和后面的make及make install都无法加入调试信息。采用 $ gdb 调试时 出现 如下 错误: (no debugging symbols found)其实...转载 2018-07-11 10:28:00 · 1501 阅读 · 0 评论 -
C++的#include和using namespace
补一点C++最最基础的东西,翻译自:stackoverflow的回答。第一个回答为了说清楚这个问题,首先要了解一些C和C++的基础。在编译C/C++时,将源文件编译为可执行文件实际上需要两个步骤:编译和链接。编译一次接受一个.cpp文件并且编译它,其它的.cpp文件对编译器来说是不可见的,这会生成一个目标文件。然后,编译器链接所有的目标文件以生成最终的可执行文件。这在C++中引入了...转载 2018-07-02 10:52:00 · 1013 阅读 · 0 评论 -
Ubuntu下yaml-cpp的安装
由于要学习的代码中用到了yaml-cpp,因此在此记录一下安装过程,翻译自:stackoverflow。关于yaml-cpp可以看一下yaml,yaml-cpp来了解一下。首先删除本地原有的yaml-cpp库:The installer just copies the header files to the directory $PREFIX/include/yaml-cpp and ...转载 2018-06-30 18:12:00 · 6726 阅读 · 0 评论 -
Ubuntu下安装boost
由于要学习的代码中用到了boost库,因此要在Ubuntu下安装boost库。安装步骤如下:# 首先删除本地原有的 boost 库rm -f /usr/lib/libboost*rm -fr 'find / -name libboost*'# 移除boost头文件mv /usr/include/boost /usr/include/boost-bak# 下载 wgetapt-...转载 2018-06-29 17:28:00 · 574 阅读 · 0 评论 -
CMake
转自:HaHack以及netnoteMakefile:概述概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的集成开发环境(integrated development environment, IDE)都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编...转载 2018-06-28 16:54:00 · 284 阅读 · 0 评论 -
gdb打印std::string
假设type类型是std::string,在gdb中可以用 p (char*)type 或者 print (char*)type 来打印type的内容,打印出来的结果类似这样: $17 = 0xa87208 "STANFORD"原创 2018-07-17 15:58:23 · 9757 阅读 · 4 评论 -
C++ map的基本操作和用法
转自:seanyxie 1、map简介map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。2、map的功能 自动建立Key - value的对应。key 和 value可以是任意你需...转载 2018-07-17 16:26:48 · 979 阅读 · 0 评论 -
C++派生类的构造函数
转自:C语言中文网前面我们说基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变...转载 2018-07-17 14:15:53 · 3578 阅读 · 0 评论 -
C++中list, vector, map, set 区别与用法比较
转自:[幕三少](https://www.cnblogs.com/smiler/p/4457622.html)List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]。Vector对于随机访问的速度很快,但是对于插入尤其是在头部插入元素速度很慢,在尾部插入速度很快。List对...转载 2018-07-16 11:29:10 · 397 阅读 · 0 评论 -
C++中类的访问控制(private, protected, public)
转自:mtjpC++中 public,protected, private 访问标号小结第一:private, public, protected 访问标号的访问范围。private:只能由1.该类中的函数、2.其友元函数访问。不能被任何其他访问,该类的对象也不能访问。protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。但不能被该类的对象访问...转载 2018-07-16 10:25:13 · 547 阅读 · 0 评论 -
Ubuntu下升级cmake
在安装clang的时候遇到cmake版本过旧的问题,因此需要更新一下cmake。转载自:heroacool的专栏 1. 下载最新版的cmake,下载地址为https://cmake.org/download/2. 解压,cd cmake-3.9.0-rc53. ./configure4. make5. sudo make install...转载 2018-06-27 11:48:00 · 255 阅读 · 0 评论 -
Ubuntu下安装clang和libc++
最近在跑别人代码(Makoto Miwa - Relation Extraction)的时候需要用到clang++,所以需要在Ubuntu上安装一下clang++。转载自:算法时空 选择版本之前推荐的是当前版本trunk,但是有时它在不断更新,所以最好还是选择特定版本,这里我们选择clang 5.0最终版,那么官网指南中可将trunk改成tags/RELEASE_500/final。...转载 2018-06-27 11:57:00 · 4826 阅读 · 0 评论 -
clang代替gcc
因为需要研究的别人的代码里用到了clang++,所以在此记录一下。转载自:无求备斋笔记 gcc/g++ 和 clang/clang++ 都是 Linux 下常用的 C/C++ 编译器。gcc 是 GNU 亲儿子,Ubuntu 等常用发行版标配。clang 是后起之秀,配合 llvm,以优秀的前端闻名于世,现在已经是 Mac(XCode) 的默认编译器,微软等大公司都在往上靠,前景一片光明。...转载 2018-06-28 15:43:00 · 6200 阅读 · 0 评论 -
练习2-5 编写函数any(s1,s2),将字符串s2中的任一字符在字符串s1中第一次出现的位置作为结果返回。如果s1中不包含s2的字符,则返回-1。
练习2-5 编写函数any(s1,s2),将字符串s2中的任一字符在字符串s1中第一次出现的位置作为结果返回。如果s1中不包含s2的字符,则返回-1。#includeint any(char s1[], char s2[]){ int i, j; for(i = 0; s1[i] != '\0'; i++) { for(j = 0; s2[原创 2016-08-31 23:31:33 · 4790 阅读 · 0 评论 -
练习2-4 重新编写函数squeeze(s1,s2),将字符串s1中任何与字符串s2中字符匹配的字符都删除。
练习2-4 重新编写函数squeeze(s1,s2),将字符串s1中任何与字符串s2中字符匹配的字符都删除。参考代码:#include#include//void squeeze(char s1[], char s2[])//{// int i = 0;// int j = 0;// int n = 0;// int t; //表示s1与s2的元素原创 2016-08-31 16:50:05 · 6415 阅读 · 3 评论 -
练习2-3 编写函数htoi(s),把由16进制数字组成的字符串(包含可选的前缀0X或0x)转换成与之等价的整形值。字符串中允许包含的数字包括:0 ~ 9, a ~ f,A ~ F。
练习2-3 编写函数htoi(s),把由16进制数字组成的字符串(包含可选的前缀0X或0x)转换成与之等价的整形值。字符串中允许包含的数字包括:0 ~ 9, a ~ f,A ~ F。#include#define YES 1#define NO 0//htoi: covert hexadecimal string s to intergerint htoi(char s[]){原创 2016-08-31 15:12:17 · 5736 阅读 · 0 评论 -
练习2-2 在不使用运算符&&或|| 的条件下编写一个与上面的for循环语句等价的循环语句
练习2-2 在不使用运算符&&或|| 的条件下编写一个与上面的for循环语句等价的循环语句for ( i = 0; i < lim -1 &&(c = getchar()) != '\n' && c != EOF; ++i )s[i] = c;#include#define lim 10 //lim=10#define EOF 46 //EOF=46(.)int main(){原创 2016-08-25 21:02:17 · 2339 阅读 · 1 评论 -
练习2-1 编写一个程序以确定分别由signed及unsigend限定的char short int 与long类型变量的取值范围
练习2-1 编写一个程序以确定分别由signed及unsigend限定的char short int 与long类型变量的取值范围方法1 打印标准头文件中的响应值#include#include//determing ranges of typesint main(){// signed types printf("Signed char min =原创 2016-08-23 16:03:39 · 2807 阅读 · 0 评论 -
练习3-2 编写一个函数escape(s,t),将字符串t复制到字符串s中,并在复制过程中将换行符、制表符等不可见字符转换为\n、\t等相应的可见的转义字符序列。要求使用switch语句。
练习3-2 编写一个函数escape(s,t),将字符串t复制到字符串s中,并在复制过程中将换行符、制表符等不可见字符转换为\n、\t等相应的可见的转义字符序列。要求使用switch语句。再编写一个具有相反功能的函数,在复制过程中将转移字符序列转换为实际字符。参考代码如下:#includevoid escape(char s[], char t[]){ int i,原创 2016-09-14 11:16:54 · 7191 阅读 · 1 评论 -
练习2-6 编写一个函数setbits(x, p ,n, y),该函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。
练习2-7 编写一个函数setbits(x, p ,n, y),该函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。参考代码如下:#includeunsigned setbits(unsigned x, int p, int n, unsigned y){ return x & ~(~(~0原创 2016-09-01 16:28:39 · 6653 阅读 · 11 评论 -
练习2-7 编写一个函数invert(x,p,n),该函数返回对x执行下列操作后的结果:将x从第p位开始的n个(二进制)位求反(即1变成0,0变成1),x的其余各位保持不变。
练习2-7 编写一个函数invert(x,p,n),该函数返回对x执行下列操作后的结果:将x从第p位开始的n个(二进制)位求反(即1变成0,0变成1),x的其余各位保持不变。原创 2016-09-06 19:08:17 · 4388 阅读 · 2 评论 -
练习2-8 编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位将从最左端再移入)n(二进制)位后所得到的值。
对于这个问题,有两种思路,照旧,一种是我自己能想出来的方法,另一种是书上答案给出的方法。两种方法采用了两种不同的思路。第一种方法,也就是我自己能想出来的方法,既然x循环右移n位,那就先得到最右边n位,然后将x右移n位,此时最左边n位为0,再将得到的最右边n位放到最左边。对于这种会出现循环的情况来说,需要考虑的一点就是机器使用的字长问题,如果n大于机器字长,那么循环机器字长的倍数次相当于没有移动原创 2016-09-07 22:20:56 · 4033 阅读 · 0 评论 -
练习2-9 在求对二的补码时,表达式 x &= (x - 1) 可以删除 x 中最右边值为 1 的一个二进制位,请解释这样做的道理。用这一方法重写biecount函数,以加快其执行速度。
首先,还是先来说明一下题目的意思,一开始我看题目的时候,并没有正确理解题目的意思,题目说可以删除x中最右边值为1的一个二进制位,我一开始理解的是当x最右边一位为1时,删除这一位;看了答案之后才发现题目的意思是要将将从右边开始数第一个为1的二进制位置为0。ok,题目说完,接下来说解题思路,额,今天有点累,直接把答案扒下来吧,额,自己真的是太懒了。。。参考代码:原创 2016-09-08 11:47:06 · 1899 阅读 · 0 评论 -
练习2-10 重新编写将大写字母转换为小写字母的函数lower,并用条件表达式替代其中的if-else结构。
参考代码:#includeint lower(int c){ return c >= 'A' && c<= 'Z' ? c - 'A' + 'a' : c;}int main(){ char c = 'B'; printf("%c", lower(c)); return 0;}原创 2016-09-08 11:57:34 · 2446 阅读 · 0 评论 -
gdb watch的使用
转自:[luaohan](https://blog.csdn.net/LUAOHAN/article/details/39155977) 这里大概说下gdb调试程序时,watch的使用。至于原理尚不清楚,以后再做补充,还请见谅。watch通常需要和break,run,continue联合使用。下面举...转载 2018-07-16 21:40:54 · 1909 阅读 · 0 评论 -
gdb在文件行号上打断点
转自:100个gdb小技巧与迷茫的行者 &amp;lt;section class=&quot;normal&quot; id=&quot;section-&quot;&amp;gt; &amp;lt;h1 id=&quot;在文件行号上打断点&quo转载 2018-07-16 21:47:24 · 29727 阅读 · 0 评论 -
gdb断点的删除
断点的删除与断点的设置同样的重要。删除断点的命令有两个:delete用法:delete [breakpoints num] [range…]delete可删除单个断点,也可删除一个断点的集合,这个集合用连续的断点号来描述。例如:delete 5delete 1-10clear用法:clear 删除所在行的多有断点。 &nb...转载 2018-07-16 21:55:30 · 34723 阅读 · 0 评论 -
使用gdb调试程序,代码不按照顺序执行
转自:liggle_Chow 因为在linux下程序在编译的时候做了代码优化,如果想要在调试时按顺序执行的话可以通过设置make CFLAGS=”-g -O0”来使得编译器不做代码优化-O就是优化等级-O0就是不做优化 ...转载 2018-07-23 21:53:35 · 950 阅读 · 0 评论