[C++编程] C++编程小结

变量的声明VS定义

声明是向编译器介绍变量,它的名字、类型,可包括初值。
定义则使编译器确定变量的内存空间。
变量的声明与定义往往是同时的,

int a;

若只想声明变量,但不分配内存,extern

extern int a;

函数与变量类似。只声明不定义,如下

int add(int, int);

OpenCV

  • Rect
    参数顺序 x y w h
    Rect_ (_Tp _x, _Tp _y, _Tp _width, _Tp _height)

  • Mask
    将logo图片贴在大图上

// 原图
cv::Mat pic;
cv::Mat logo = ...;
// 确保Mask为CV_8UC1
cv::Mat mask = ...;
logo.copyTo(pic(cv::Rect(1,3,1920,1080)), mask);
auto mask_ = cv::Mat::zeros(imGray.size(), CV_8UC1);
cv::Rect rect(0, 0, 1920, 1020);
mask_(rect).setTo(255);
  • cv::Mat::reshape
    cv::Mat::reshape(int channels, int rows),参数分别为通道数,行数,
    注意与python numpy的reshape不同。

Eigen

  • NColsBlockXpr<N>::Type middleCols(Index startCol, Index n = N)
    返回矩阵中的一块,包含n列。
  • Ax=b
x_ = H_.ldlt().solve(Jres_);
  • 块操作
Matrix4d T;
Matrix3d R;
R = T.block<3,3>(0,0);
Vector3d p;
Vector2d px=p.head<2>()/p[3];
//第i个元素开始的n个元素
p.segment<i>(n);
  • skew
  • 四元数
    Eigen::Quaterniond = Eigen::Matrix3d()*Eigen::Quaterniond()
  • LLT
  • MAP

C++ 内存管理

allocator

分配未构造的内存。

//可以分配std::string的对象
std::allocator<std::string> alloc;
//分配n个未初始化的string
auto const p = alloc.allocate(n);
//q指向最后构造的元素之后的位置
auto q = p;
alloc.construct(q++);
alloc.construct(q++, 10, 'c');
alloc.construct(q++, “hello,world”);
while(q != p){alloc.destroy(--q);
}

模板

  template <typename T, int a, int b> using Matrix = Eigen::Matrix<T, a, b>;Matrix<double, 2, 6> frame_jac;

静态成员

  1. 静态成员为类的全部对象共享,类似于全局变量。例如,银行账户类需要与利率关联,我们期望利率与类关联,而非与类的各个对象关联,从实现效率的角度看,没必要每个对象都存储利率信息,更重要的,一旦利率浮动,期望所有对象都能使用新值。
  2. 在类的外部定义和初始化每个静态成员,只有常值变量const 或 constexpr 静态变量可以在声明时初始化。
  3. 静态数据成员定义在任何函数之外,一直存在于程序的整个生命周期中。
  4. If the member is used only in contexts where the compiler can substitute the member’s value, then an initialized const or constexpr static need not be separately defined. However, if we use the member in a context in which the value
    cannot be substituted, then there must be a definition for that member. 除只用于在编译时替换静态变量的值外,需要在类外对静态成员变量初始化,以保证编译正确。
  5. 静态成员函数内部不能引入非静态成员变量,非静态成员可以使用静态成员。
  6. static constexpr声明
class Account {
public:
void calculate() { amount += amount * interestRate; }
static double rate() { return interestRate; }
static void rate(double);
private:
std::string owner;
double amount;
static double interestRate;
static double initRate();
};

拷贝控制的3/5法则

3种方法控制类的拷贝操作,复制构造、复制赋值运算符、析构函数;新标准增加了移动构造、移动赋值。

  1. 需要(自定义)析构函数的类也需要拷贝控制,复制构造函数、赋值运算符号。
  2. 需要复制操作的类也需要赋值操作,反之亦然,不需要析构函数。

拷贝控制示例

C++ Primer中簿记操作的例子,设计两个类,可用于邮件处理应用。

Message与Folder类

  1. Message保存Folder指针的set;Folder保存Message指针的set。
  2. 复制构造一个Message时,副本即新创建的对象和原对象是两个不同的对象,但都在相同的Folder中,即需要拷贝Folder指针的集合,在包含此消息的Folder中都添加新创建的Message指针。
  3. 将一个Message对象赋值给另一个Message时,左侧Message的消息内容被右侧的替换;从所有包含左侧Message的Folder中删除该Message指针;并将该Message指针添加到右侧Message的Folder指针集合。
  4. 销毁Message时,从包含此Message的所有Folder中删除此Message指针。

总结,析构函数和复制赋值函数中都有从包含原Message的所有Folder中删除该Message指针;复制构造函数和复制赋值函数都包含新Message指针添加到Folder中。

模拟标准库中的vector

时刻

  • C语言
#include <ctime>
time_t t_cur=time(0);
//...
time_t t_now=time(0);
//运行时间
double dt=difftime(ts_now, ts_cur);
  • C++
#include <chrono>std::chrono::time_point<std::chrono::system_clock> now;
auto start = std::chrono::steady_clock::now();
//...
auto end = std::chrono::steady_clock::now();
std::chrono::duration<double> diff = end -start;
double time = diff.count();

工程问题解决

/usr/bin/ld: warning: libpng12.so.0, needed by xxx/libgdal.so.20, not found (try using -rpath or -rpath-link)

解决方法sudo apt install libpng12-0

error: ‘function’ is not a member of ‘std’
指明C++11特性
g++ test.cpp -std=c++0x

TypeError: 'builtin_function_or_method' object is not iterable
问题原因:调用成员函数未加()

  • 启用core dump功能,并设置目录和命名规则
    /proc/sys/kernel/core_uses_pid可以控制产生的core文件的文件名中是否添加pid作为扩展,如果添加则文件内容为1,否则为0
    /proc/sys/kernel/core_pattern可以设置格式化的core文件保存位置或文件名,比如原来文件内容是core-%e
    echo “/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern

  • 类的静态成员未初始化,导致undefined references to

ulimit -c unlimited
sudo bash -c 'echo /tmp/core.%e.%p > /proc/sys/kernel/core_pattern'
cat /proc/sys/kernel/core_pattern
  • because the following virtual functions are pure within
    定义ceres::CostFunction的子类,重定义虚函数时,缺少右边的const导致error
virtual bool Evaluate(double const *const *parameters, double *residuals,
double **jacobians) const 

json

    for (json::const_iterator it = json_in.begin(); it != json_in.end(); ++it) {auto k = it.key();auto v = it.value();}

json可以支持“大”数组。

    std::map<std::string, std::string> a;a.insert(std::pair<std::string, std::string>("3", "zhang"));std::map<std::string, std::string> b;b.insert(std::pair<std::string, std::string>("4", "li"));std::vector<std::map<std::string, std::string>> vf{a,b};json j(vf);std::ofstream ofs("./test_new_json.json");ofs << j;ofs.close();

编程体会

  1. 明确目标,把目标分阶段,保证可以实现,循序渐进
  2. 谋定后动:先写出要实现的功能函数,再具体实现
  3. 自上而下设计,从最终目标开始,从总到分,从抽象到具体实现,先写出类、函数功能再具体实现
  4. 广泛深入调研参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/259451.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程链信任-父进程欺骗

文章目录 前记普通权限的父进程欺骗ShllCode上线进程提权基础进程提权注入 前记 父进程欺骗作用&#xff1a; 进程链信任免杀进程提权 检测&#xff1a; etw 普通权限的父进程欺骗 #include<stdio.h> #include<windows.h> #include <TlHelp32.h>DWORD …

Matlab|基于支持向量机的电力短期负荷预测【最小二乘、标准粒子群、改进粒子群】

目录 主要内容 部分代码 结果一览 下载链接 主要内容 该程序主要是对电力短期负荷进行预测&#xff0c;采用三种方法&#xff0c;分别是最小二乘支持向量机&#xff08;LSSVM&#xff09;、标准粒子群算法支持向量机和改进粒子群算法支持向量机三种方法对负荷进行…

代码随想录刷题笔记 DAY 29 | 非递减子序列 No.491 | 全排列 No.46 | 全排列 II No. 47

文章目录 Day 2901. 非递减子序列&#xff08;No. 491&#xff09;1.1 题目1.2 笔记1.3 代码 02. 全排列&#xff08;No. 46&#xff09;2.1 题目2.2 笔记2.3 代码 03. 全排列 II&#xff08;No. 47&#xff09;3.1 题目3.2 笔记3.3 代码 Day 29 01. 非递减子序列&#xff08;…

docker ubuntu tomcat 换源 安装软件

第一种办法参考docker中ubuntu容器更换apt源_ubuntu更改apt源 with dockerfile-CSDN博客 sed -i s/archive.ubuntu.com//mirrors.aliyun.com/g /etc/apt/sources.list sed -i s/security.ubuntu.com//mirrors.aliyun.com/g /etc/apt/sources.list apt update apt install vim…

- 工程实践 - 《QPS百万级的有状态服务实践》02 - 冷启动和热更新

本文属于专栏《构建工业级QPS百万级服务》 继续上篇《QPS百万级的有状态服务实践》01 - 存储选型实践。如图1架构&#xff0c;我们已经解决了数据生产的问题。 图1 但是我们的服务已经在运行了&#xff0c;并实时处理大量的请求&#xff0c;我们如何把内存中的数据版本更新呢。…

09_Java集合

一、Java集合框架概述 一方面&#xff0c; 面向对象语言对事物的体现都是以对象的形式&#xff0c;为了方便对多个对象的操作&#xff0c;就要对对象进行存储。另一方面&#xff0c;使用Array存储对象方面具有一些弊端&#xff0c;而Java 集合就像一种容器&#xff0c;可以动态…

模型超参数寻优

参考某篇QSAR的sci论文设置 根据上图&#xff0c;我设置我的XGBoost模型&#xff1a; # 定义要搜索的超参数的候选值 param_grid {model__learning_rate: [0.1, 0.01, 0.001], # 调整学习率model__n_estimators: [50, 100, 200, 300,400,500], # 调整树的数量model__max_de…

【MySQL】变量、流程控制

一、变量 在MySQL的存储过程与函数中&#xff0c;可以使用变量来存储查询或计算的中间结果数据&#xff0c;或者输出最终的结果数据。它可以分为用户自定义变量与系统变量 1、系统变量 1&#xff09;系统变量分为全局变量&#xff08;需要使用关键字global&#xff09;和会话…

JRT监听-PDF-Excel-Img

依赖全新设计&#xff0c;我们无需再顾虑历史兼容性的束缚&#xff1b;同时&#xff0c;基于多年来累积的深入需求理解&#xff0c;JRT监听机制巧妙地借助CMD命令模式&#xff0c;达成了监听的全面统一。无论是PDF、Excel还是图片文件&#xff0c;都不再需要特殊对待或额外区分…

unity学习(15)——服务器组装(1)

1.新建好的c#项目如下&#xff1a; 文件夹中内容如下&#xff1a; 此时已经可以通过vs2022打开.sln文件&#xff0c;就可以打开项目了。 2.我们把逆向后&#xff08;主程序&#xff09;的内容的代码粘贴过去。有些逆向功底&#xff0c;很快可以定位到&#xff0c;服务器的入口…

【Java EE初阶十八】网络原理(三)

3. 网络层 网络层要做的事情主要是两方面&#xff1a; 1)、地址管理&#xff1a;制定一系列的规则,通过地址,描述出网络上一个设备的位置&#xff1b; 2)、路由选择&#xff1a;网络环境是比较复杂的&#xff0c;从一个节点到另一个节点之间&#xff0c;存在很…

【GPT-2】论文解读:Language Models are Unsupervised Multitask Learners

文章目录 介绍zero-shot learning 零样本学习 方法数据Input Representation 结果 论文&#xff1a;Language Models are Unsupervised Multitask Learners 作者&#xff1a;Alec Radford, Jeff Wu, Rewon Child, D. Luan, Dario Amodei, I. Sutskever 时间&#xff1a;2019 介…

Linux系统中 uboot、内核与文件系统之间的关系

前言&#xff1a; 最近正在学习Linux&#xff0c;总结了一下Linux系统中 uboot、内核与文件系统之间的关系 Linux初学者首先要搞清楚的三个文件: 引导程序(bootoader):uboot.bin/uboot.imx Linux内核镜像: zlmage 文件系统镜像:system.img/rootfs.tar.ba2 初期很多工作都是围…

文件上传漏洞--Upload-labs--Pass02--Content-Type绕过

一、什么是 Content-Type 我们在上传文件时利用 Burpsuite 进行抓包&#xff0c;如下图所示&#xff1a; 上传文件后台的源代码可能会对 Content-Type 进行规定&#xff0c;设置白名单 或 黑名单&#xff0c;这时就要利用Content-Type绕过上传含有恶意代码的 php文件。 二、代…

[ linux网络 ] 网关服务器搭建,综合应用SNAT、DNAT转换,dhcp分配、dns分离解析,nfs网络共享以及ssh免密登录

实验准备工作&#xff1a; 网关服务器安装&#xff1a;dhcp bind &#xff08;yum install -y dhcp bind bind-utlis&#xff09; server1安装&#xff1a;httpd (yum install -y httpd) 没有网络就搭建本地yum仓库或者配置网卡使其能够上网。 ( 1&#xff09;网关服务器…

unity C#中的封装、继承和多态简单易懂的经典实例

文章目录 封装 (Encapsulation)继承 (Inheritance)多态 (Polymorphism) C#中的封装、继承和多态是面向对象编程&#xff08;OOP&#xff09;的三大核心特性。下面分别对这三个概念进行深入解释&#xff0c;并通过实例来说明它们在实际开发中的应用。 封装 (Encapsulation) 实例…

解决updatexml和extractvalue查询显示不全

报错注入是一种常见的SQL 注入方式&#xff0c;通过注入代码&#xff0c;触发数据库的错误响应&#xff0c;并从错误信息中获取有用的信息。 updatexml和extractvalue updatexml和extractvalue 是常用的两个报错注入函数 http://localhost/sqli/Less-5/?id1%27and%20updat…

【Pygame手册03/20】用于绘制形状的 pygame 模块

目录 一、说明二、画图函数2.1 接口draw下的函数2.2 pygame.draw.rect()2.3 pygame.draw.polygon()2.4 pygame.draw.circle()2.5 pygame.draw.ellipse()2.6 pygame.draw.arc()2.7 pygame.draw.line ()2.8 pygame.draw.lines()2.9 pygame.draw.aaline()2.10 pygame.draw.aaline…

【Redis】理论进阶篇------Redis的主从复制

一、原理解释 1、什么是Redis的主从复制 主从复制&#xff0c;是指将一台Redis服务器的数据复制到其他Redis服务器。前者称为主节点&#xff08;master&#xff09;,后者称为从节点&#xff08;slave&#xff09;;对于数据的复制是单项的&#xff0c;只能从主节点到从节点。Ma…

C#上位机与三菱PLC的通信06--MC协议之QnA-3E报文测试

1、A-3E报文回顾 1、存储区分类及访问规则 2、命令类型 命令由主命令子命令组成 3、报文结构 2、启动mc服务器 3、创建VS项目 这节继续使用上节的VS2022的项目&#xff0c;增加一个方法 MCTestA3E()&#xff0c;具体怎么创建项目&#xff0c;见上节的过程。C#上位机与三菱…