
C++
文章平均质量分 60
卡尔曼和玻尔兹曼谁曼
面朝大海,春暖花开
展开
-
关于C++函数返回值的拷贝优化问题
在传统C++程序中,如果函数的返回值是一个对象的话,可能需要对函数中的局部对象进行拷贝。如果该对象很大的话,则程序的效率会降低。在C++ 11以后,出现的移动语义(Move Semantic)及拷贝优化(Copy Elision)都是解决这个问题的方法。本文试图以一个最简单的例子来说明这个问题。原创 2023-09-08 09:42:41 · 701 阅读 · 0 评论 -
Windows下CLion中文乱码问题解决
当然,对于新版的Windows 11我们可以手动在设置中将操作系统的编码调整为UTF-8,这样文件源码以及控制台终端编码都统一为UTF-8肯定就没问题了,但是这样会导致其他一些软件乱码。Windows内部采用UTF-16编码,对于中文操作系统使用GBK编码,但是CLion默认文本编码为UTF-8,当编码不一致时,就会造成输出乱码,甚至编译不通过。所以,取消选中“run.processes.with.pty”以后,控制台输出采用的是UTF-8编码。而GBK编码是定长的编码,一个汉字占两个字节。原创 2022-10-04 11:17:07 · 3131 阅读 · 2 评论 -
R包安装过程中开启C++11支持
R包安装过程中开启C++11支持R包安装过程中开启C++11支持问题描述问题解决R包安装过程中开启C++11支持自打工作以后,就很少有闲余时间写写博客,分享自己学习的点点滴滴了。也许这就是上学和工作的区别吧。问题描述打算利用R读取ASD光谱文件,需要安装prospectr包,使用常规命令install.packages("prospectr")死活安装不上,提示需要编译器支持C++11。报错信息如下:“*** C++11 compiler required; enable C++11 mode原创 2021-12-08 11:40:01 · 1034 阅读 · 0 评论 -
Windows下Boot的编译和使用
1。首先在Boost的官网下载Boot源码,分为Windows版本和Linux版本。下载好以后进行加压(我的解压目录是:E:\C++\Library\boost_1_62_0)。2。Windows下Boot的编译需要根据自己的Visual Studio版本,然后选择编译(x86,x64)版本,以及(Debug,Release)版本。我自己的是VS2013。从开始菜单打开VS的Tools Comman原创 2016-10-08 14:56:45 · 1952 阅读 · 0 评论 -
C++获得毫秒级的时间差
下面的代码支持Windows和Linux,但是要求编译器必须支持C++11。#include <iostream>#include <chrono>using std::chrono::high_resolution_clock;using std::chrono::milliseconds;int main(){ high_resolution_clock::time_point b原创 2016-10-08 09:44:37 · 10393 阅读 · 0 评论 -
gcc编译参数:如何包含头文件和动态链接库
以上一个代码实例gdal计算NDVI为例: 如何在Linux下使用gcc进行编译? (顺便说一下,上次的代码只能在gdal1下编译,因为gdal2和1的API稍微有些改动) gdal的动态链接库如果采用默认的安装方式应该在/usr/local/lib目录下面,而头文件在/usr/include/gdal目录下面。 那么,我们的编译命令应该是这样的:g++ NDVI.cpp -std=c++1原创 2016-09-08 16:28:34 · 4746 阅读 · 0 评论 -
C++10中的移动语义
首先,我们来看这样一个函数: (T为一个对象类型)T clone(const T& rhs){ T other = rhs; return other;}这样的函数中,其实会调用两次拷贝构造函数。我们写一个实例看看:class Example{public: Example(); Example(const Example& other); ~Exa原创 2016-01-13 18:20:32 · 3328 阅读 · 2 评论 -
QT QSplitter随窗口自适应大小(Autosize)
最近在使用Qt做一些东西,中间遇到一些问题,记录之,希望能帮助到其他遇到此类问题的朋友。 1. QSplliter充满整个窗体,随着父窗体的大小而自动改变大小。 2. 在Qt Creator中的Design视图中,拖拽两个控件到centralWidget,然后同时选中这两个Widget选择工具蓝中的Lay Out Horizontally in Splitter,这样就将两个Widget放到了原创 2015-12-26 21:57:32 · 11596 阅读 · 1 评论 -
C++中map按value排序
我们知道C++ STL中的map是以key排序的。int main(){ map<int, int> iMap; iMap[1] = 20; iMap[2] = 10; iMap[5] = 30; iMap[4] = 0; for (auto it = iMap.begin(); it != iMap.end(); it++) cou原创 2015-09-18 18:00:36 · 13127 阅读 · 0 评论 -
C++中关于const的一些使用惯例
最近在公司使用C++做项目,对工作中发现的问题进行总结!大家都知道,C++的const关键字是申明一个常量,以前没有深入接触C++的时候也没觉得有什么特别的用法。下面说说我最近工作中发现的关于const的一些使用惯例,我这里所说的使用惯例,是指C++编码中推荐的做法。1)函数中的const参数 我们可能会看到类似这样的一个函数声明: void copy(const string& strDest原创 2015-07-11 14:56:58 · 930 阅读 · 0 评论 -
C/C++宏定义中#与##区别
// #表示:对应变量字符串化// ##表示:把宏参数名与宏定义代码序列中的标识符连接在一起,形成一个新的标识符#include <stdio.h>#define trace(x, format) printf(#x " = %" #format "\n", x)#define trace2(i) trace(x##i, d)int main(){ int i=1; cha转载 2015-06-24 17:30:28 · 928 阅读 · 0 评论 -
C++11多线程初体验
在C++11标准之前,使用C++编写多线程程序要么需要第三方的API如pthread,要么需要依赖运行平台提供的API,使用起来很不方便。而C++11提供了平台无关的语言级别的支持,这极大得方便了我们开发人员。C++11的多线程支持主要通过使用如下的头文件中的类或者函数:<atomic><thread><mutex><condition_variable><future>。新建线程通过std::th原创 2015-05-18 16:47:51 · 1134 阅读 · 0 评论 -
Linux下Boot的编译和使用
其实Linux下的编译安装过程和Window下的是差不多的(Windows下Boot的编译和使用) 首先在官网下载安装包进行解压,然后执行bootstrap.sh脚本。tar -xzvf boost_1_62_0.tar.gzcd boost_1_62_0./bootstrap.sh然后进行编译安装,默认安装路径是/usr/local。所以,相应的头文件在/usr/local/include/原创 2016-10-08 16:09:01 · 1240 阅读 · 0 评论 -
C++可变参数
Java中的可变参数其实就是数组,对C++的可变参数比较好奇,所以上网查了资料,了解下!首先,C++中可变参数的定义:void function(...)我们一般会在参数中定义可变参数的个数,所以有一下形式:void function(int num ...)我在Visual Studio 2010下试验过void function(int num, ...)也能正常编译。原创 2014-03-19 00:36:40 · 1867 阅读 · 0 评论 -
C++ std::vector元素的内存分配问题
来看一个问题: 在使用C++ STL的vector时,下面三种写法有什么不同呢?其内存分配是怎么样的呢?std::vector<T> vec;std::vector<T>* Vec = new std::vector<T>();std::vector<T*> vec;首先,说结论吧: 对于std::vector<T> vec;vec在栈上(stack),而其中的元素T保存在堆上(heap);原创 2016-01-17 22:11:00 · 13275 阅读 · 4 评论 -
C++中的万能引用和完美转发
文章目录C++中的万能引用和完美转发万能引用(Universal Reference)引用折叠(Universal Collapse)完美转发(Perfect Forwarding)C++中的万能引用和完美转发阅读这篇博文需要了解C++中的左值(lvalue)和右值(rvalue)的概念,详情参见我的另外一篇博文:C++移动语义及拷贝优化万能引用和完美转发多涉及到模板的使用,如若不是自己写...原创 2019-01-21 07:37:27 · 4302 阅读 · 11 评论 -
C++函数指针和std::function对象
C++函数指针和std::function对象这篇博文中通过实现对String字符串大小写转换为列来说明C++中函数指针和std::function对象的使用。我们在博文《C++实现一个简单的String类》中的自定义的String类为基础,再添加两个成员函数用于将字符串全部转为大写(toUpperCase)和全部转为小写(toLowerCase)。分析一下这两个函数,我们可以发现,两个函数...原创 2018-10-08 22:22:02 · 7652 阅读 · 0 评论 -
C++17使用std::apply和fold expression对tuple进行遍历
C++17使用std::apply和fold expression对std::tuple进行遍历std::apply函数先来看这个std::apply函数,这个函数定义在tuple头文件中,函数签名如下:template <class F, class Tuple>constexpr decltype(auto) apply(F&& f, Tuple&&...原创 2018-10-08 12:25:41 · 6320 阅读 · 0 评论 -
C++移动语义及拷贝优化
C++移动语义及拷贝优化我们知道在传统C++程序中,如果函数的返回值是一个对象的话,可能需要对函数中的局部对象进行拷贝。如果该对象很大的话,则程序的效率会降低。在C++ 11以后,出现的移动语义(Move Semantic)及拷贝优化(Copy Elision)都是解决这个问题的方法。这篇博文简单探探这些技术。再谈移动语义对于C++ 11移动语义的介绍,我之前写过一篇博客《C++11中的移...原创 2018-10-07 03:37:42 · 1689 阅读 · 0 评论 -
C++实现一个简单的String类
title: C++实现一个简单的String类date: 2018-10-06 12:40:38tags: [C++, String]categories: C++C++实现一个简单的String类使用基本的C++知识实现一个简单的String类,这个类中包含了C++常用的知识点。感觉是很有意思的一个小代码片段。跟大家分享一下我的实现,欢迎大家批评指正。类声明该类中包含了三...原创 2018-10-07 01:13:46 · 770 阅读 · 0 评论 -
C++中argmin和argmax的实现
C++中argmin和argmax的实现在Python中argmin和argmax这两个函数一般是用来就一列数中的最小值和最大值的索引。C++中我们如何实现呢?实现思路使用STL中的std::min_element函数求出最小值;使用STL中的std::distance计算最小值跟迭代器的头部的距离;实现代码#include <algorithm>template&...原创 2018-10-13 10:24:08 · 10090 阅读 · 3 评论 -
Python调用C++代码
Python调用C++代码今天在研究PyTorch中Tensor的一些操作的时候,发现其底层Tensor的操作都是用C++写的,并使用pybind11进行C++和Python的桥接。所以,我就想着探索一下Python中如何调用C++代码?可行方案其实,方案还是挺多的:Python内置的ctypes接口(可以将C/C++代码编译为动态库,在Python中进行调用)CFFI(提...原创 2018-09-07 06:13:23 · 8638 阅读 · 1 评论 -
C++中字符串的分割
坚持走下去,坚持下去!男子汉要能惹! —题记下面开始正题,C++中字符串的分割。 1. 使用strtok函数进行字符串的分割 2. 使用stringstream类配合getline函数进行字符串的分割 3. 使用STL的find函数以及字符串类的substr函数进行字符串分割strtok函数介绍: 头文件:#include <string.h>定义函数:char * strtok(char原创 2016-01-04 22:34:48 · 6818 阅读 · 2 评论 -
C++ std::vector元素的内存分配问题(补充)
在上篇博文C++ std::vector元素的内存分配问题中我们已经明确了使用std::vector容器时元素在内存中的创建情况。 所以,我个人觉得使用std::vector<T> vec;这种类型的最省时省力。 我们还是看原来的例子:#include <iostream>#include <vector>using std::cout;using std::vector;class A{原创 2017-02-22 15:59:07 · 2042 阅读 · 0 评论 -
C++多重继承的指针问题
下面说说C++多重继承中关于指针的一些问题。指针指向问题 先看下面的程序:class Base1{public: virtual void fun1() {cout << "Base1::fun1" << endl;};};class Base2{public: virtual void fun2() {cout << "Base2::fun1" << endl;};}原创 2015-05-17 21:04:23 · 3200 阅读 · 1 评论 -
C++中虚基类
如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员。 C++提供虚基类(virtual base class)的方法,使得在继承间接共同基类时只保留一份成员。下面举例说明: 在如下的图中: Person类是Student和Teacher的基类,而Graduate类又继承自Student和Teacher类。 如果使用原创 2015-05-16 21:51:35 · 1305 阅读 · 0 评论 -
C++结构体前面为什么会经常使用typedef
C++代码中定义几个结构体:原创 2014-10-13 19:13:39 · 4142 阅读 · 4 评论 -
C++数组名a和&a的区别
先看一道测试题:原创 2014-10-24 17:01:54 · 2483 阅读 · 0 评论 -
C++中动态申请二维数组
今天有同门问到这个问题,写出来代码,进行记录。使用newyunsu原创 2014-04-28 19:57:19 · 1132 阅读 · 0 评论 -
Linux下 编译C++
Linux下 编译C++在编译之前我们需要在系统里安装G++ GCC,它们就是Linux下的C++/C的编译器。代码如下代码:sudo apt-get install build-essentialsudo apt-get install gccsudo apt-get install g++好,现在我们在文本编辑器里写一个C的简单的程序(好像所有学习C或者C+转载 2014-04-22 17:15:55 · 1388 阅读 · 0 评论 -
C++虚函数
虚函数是动态多态性的基础,其调用的方式是动态联编(又称晚期联编,简单解释为只有在程序运行时才决定调用基类的还是子类的,系统会根据基类指针所指向的对象来决定要调用的函数);非虚函数与其相反,是静态联编(调用已经在编译时期就决定了;在编译时期,系统已经根据指针所属的类型确定了要调用的函数)。在具体看虚函数前,我们先看一个例子:头文件定义#pragma onceclass S原创 2014-03-19 17:59:10 · 1235 阅读 · 0 评论 -
C++虚基类
如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员。C++提供虚基类的方法,使得在继承间接共同基类时只保留一份成员。现在,将类A声明为虚基类,方法如下:class A//声明基类A{…};class B :virtual public A//声明类B是类A的公用派生类,A是B的虚基类{…};cla原创 2014-03-19 19:36:55 · 1357 阅读 · 0 评论 -
C++指向函数的指针
函数指针是指向函数而非指向对象的指针。与其他类型的指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关。函数指针的声明如下:返回值类型 (*函数指针名)(函数参数列表)例如:double (*fun)(double, double)先看一个实例:#include using namespace std;double add(doub原创 2014-03-19 11:21:43 · 975 阅读 · 0 评论 -
C++参数传递
C++和Java、C#语言在参数传递的时候,最大的不同就是在 C++ 中,除非显式通过指针或引用传递,否则所有变量都通过值传递。在 C# 中,除非显式通过具有 ref 或 out 参数修饰符的引用传递,否则类通过引用传递,而结构通过值传递。Java中类通过引用传递,基本数据类型通过值传递。具体说来:C++中每次调用函数时,都会重新创建该函数所有的形参,此时所传递的实参将会初始化对应的形参。原创 2014-03-19 10:41:29 · 993 阅读 · 0 评论 -
C++中遍历数组
C++中数组不像Java中的有length属性,所以不能直接进行遍历,怎么办呢?首先,来看C++中一个有用的操作符sizeof。sizeof操作符的作用是返回一个对象或类型名的长度,返回值得类型为size_t,长度的单位是字节。来看一个实例:#include using namespace std;int main(){ size_t length; length = s原创 2014-03-19 11:42:20 · 22363 阅读 · 0 评论 -
C++中派生类成员的访问属性
一下是摘自谭浩强《C++面向对象程序设计》一书中的内容:在派生类中,对基类的继承方式可以有public(公用的)、private (私有的)和protected(保护的)3种。不同的继承方式决定了基类成员在派生类中的访问属性。简单地说:(1) 公用继承(public inheritance)基类的公用成员和保护成员在派生类中保持原有访问属性,其私有成员仍为基类私有。(2)原创 2014-03-19 15:47:59 · 2038 阅读 · 0 评论 -
VC++中单元测试
Visual Studio中可以直接进行C++项目的单元测试,下面为自己测试的步骤记录。(测试环境为Visual Studio2013,2012步骤相同)首先,新建C++控制台项目,写自己的要测试的函数。头文件:#pragma once;namespace Hello{ int max(int data[], int num);}源文件:#include "He原创 2015-01-15 23:17:31 · 3118 阅读 · 0 评论 -
C/C++程序编译过程
当我们进行编译的时候,要使用一系列的工具,我们称之为工具链,其中包括:预处理器cpp编译器gcc/g++汇编器as链接器ld一个C/C++程序编译过程包括下面几个阶段:预处理 预处理器cpp将对源文件中的宏进行展开。编译 gcc将c文件编译成汇编文件。汇编 汇编器as将汇编文件编译成机器码。链接 链接器ld将目标文件转载 2015-01-15 23:27:32 · 914 阅读 · 0 评论 -
给int赋最小值问题
int n = -2147483648; 如此简单的一句代码,居然出现了警告?-2147483648是32位int类型可以存储的最小整型值,为什么会出项警告呢。在VC++6.0控制台程序下出现如下警告:warning C4146: unary minus operator applied to unsigned type, result still unsigned。在C-F转载 2015-02-04 19:18:28 · 1892 阅读 · 0 评论 -
C++11智能指针
C成也指针,败也指针。确实,指针给程序员提供了很多便利和灵活性,但是不当的指针使用也会造成很多问题。 Java和C#避免了指针(虽然C#中也能使用指针,但是估计很少有人这样做),其垃圾回收机制,给程序员减轻很多管理内存的负担。为了带来指针更好的使用体验,C++中引入了智能指针的概念,其实质就是将指针的一些操作封装成类,程序员通过使用熟悉的指针运算符(-> 和 *)访问封装指针,该指针类通过运算符重原创 2015-05-16 16:36:36 · 2315 阅读 · 0 评论