[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.mfbz.cn/a/394725.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Arduino UNO设计一个温控制系统

目录 概述 1 硬件结构 1.1 整体硬件介绍 1.2 硬件连接结构 2 软件设计 2.1 软件功能介绍 2.2 关于Arduino的一些知识点 2.2.1 定时器 2.2.2 PWM 2.3 代码实现 2.3.1 编译工具 2.3.2 详细代码 3 测试 3.1 温度数据监控 3.2 温控测试 概述 本文介绍如何使用Ardui…

深度学习(16)--基于经典网络架构resnet训练图像分类模型

一.项目介绍 使用PyTorch工具包调用经典网络架构resnet训练图像分类模型&#xff0c;用于分辨不同类型的花 二.项目流程详解 2.1.引入所需的工具包 import os import matplotlib.pyplot as plt # %matplotlib inline import numpy as np import torch from torch import nn …

三防平板丨平板终端丨加固平板丨户外勘测应用

随着科技的不断发展&#xff0c;现代勘测业也在不断升级。相较于传统的勘测设备&#xff0c;三防平板在户外勘测中有着广泛的应用。那么&#xff0c;三防平板在户外勘测中究竟有哪些优势呢&#xff1f; 首先&#xff0c;三防平板具备极强的防水、防尘、防摔能力。在野外勘测中&…

android studio模拟器不能打开

Andriod:The selected AVD is currently running in the Emulator. Please exit the emulator instance… 1.点击 2.删除下面文件 3.重新打开即可 参考

【XR806开发板试用】 UART串口通信篇

目录&#xff1a; 一. 环境配置 二. 串口通信 三. oled显示 总结&#xff1a;源码中有头文件及例子等。 一.环境配置 在https://aijishu.com/a/1060000000286755中已经写好。 二.UART串口通信 2.1 简单介绍 通用异步收发传输器&#xff08;Universal Asynchronous Receiv…

[Angular 基础] - 视图封装 局部引用 父子组件中内容传递

[Angular 基础] - 视图封装 & 局部引用 & 父子组件中内容传递 之前的笔记&#xff1a; [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 以上为静态页面&#xff0c;即不涉及到跨组…

APP出海类型有哪些?流量主如何选择广告变现平台?

APP出海成了目前的新趋势&#xff0c;对开发者而言&#xff0c;广告策略和流量分配的方法上也面临着诸多挑战。 一、APP出海类型 01、游戏类应用 游戏类应用是移动应用出海中最受欢迎的类型之一。这类应用通常具有较高的娱乐性和互动性&#xff0c;能够吸引大量用户下载和使…

Eclipse - Expressions Add Watch Expression

Eclipse - Expressions & Add Watch Expression References Window -> Show View -> Other… Show View -> Debug -> Expressions -> Open Debug 模式下出现 Expressions 窗口 Debug 模式下&#xff0c;如果需要查看指定变量或者返回函数的值&#xff0c;直…

区块链技术和Hyperledger Fabric介绍

1 区块链介绍 1.1 区块链技术形成 1.1.1 起源 在比特币诞生之时&#xff0c;技术专家们开始研究比特币的底层技术&#xff0c;并抽象提取出来&#xff0c;形成区块链技术&#xff0c;或者称分布式账本技术。 1.1.2 定义 简称BT&#xff08;Blockchain technology&#xff…

跨境电商无货源如何实现自动化对接1688货源商品上架?1688商品采集API来帮你

阿里巴巴集团旗下的B2B电子商务网站&#xff0c;提供海量优质商品&#xff0c;为采购商和供应商提供交流、合作、采购等服务&#xff0c;是很多没有货源优势的电商卖家首选的货源途径&#xff0c;也是国内最大、货源种类最齐全的货源网站。 不少做跨境电商无货源的朋友都想要直…

UE5 C++ UObject实例化

一.创建UObject C类 在MyObject中声明结构体FMyDataTableStruct 在MyPawn里面&#xff0c;先将头文件里包含 MyObject.h 在MyPawn中声明一个UMyObject类型的指针 TSubclassOf 是提供 UClass 类型安全性的模板类。例如您在创建一个投射物类&#xff0c;允许设计者指定伤害类型…

SSH密钥认证登陆流程(Vscode连接到远程)

目录 前言连接远程步骤1. 下载工具包wsCli到本地机器2. 本地机器上生成ssh密钥3. 在服务器上安装公钥4. vscode连接到远程 参考资料 前言 SSH&#xff08;Secure Shell&#xff09;是一种用于远程登录和安全传输数据的网络协议。它提供了两种主要的远程连接方式&#xff1a; 密…

迁移公众号必须公证吗?

公众号迁移的好处有哪些&#xff1f;迁移后原公众号还能用吗&#xff1f;公众号迁移的好处有很多哦&#xff01;比如可以获得更多权限功能、公司变更或注销时可以保证账号的正常使用、收购账号后可以改变归属权或使用权等等。不过要注意的是&#xff0c;迁移后原公众号就不能再…

用户权限管理系统需求分析(附文档下载)

整体目录 引言 1.1 项目简介 本文档对通用用户权限管理系统的总体设计、接口设计、界面总体设计、数据结构设计、系统出错处理设计以及系统安全数据进行了说明。 1.2 编写说明 1&#xff0e;3参考资料 《通用权限管理系统需求规格说明书》 《通用权限管理系统数据库设计说…

mysql 2-18

加密与解密函数 其他函数 聚合函数 三者效率 GROUP BY HAVING WHERE和HAVING的区别 子查询 单行子查询和多行子查询 单行比较操作符 多行比较操作符 把平均工资生成的结果当成一个新表 相关子查询 EXISTS 一条数据的存储过程 标识符命名规则 创建数据库 MYSQL的数据类型 创建表…

【RT-DETR有效改进】注意力与卷积的高效融合 | ACmix自注意力与卷积混合模型

一、本文介绍 本文给大家带来的改进机制是ACmix自注意力机制的改进版本&#xff0c;它的核心思想是&#xff0c;传统卷积操作和自注意力模块的大部分计算都可以通过1x1的卷积来实现。ACmix首先使用1x1卷积对输入特征图进行投影&#xff0c;生成一组中间特征&#xff0c;然后根…

DS:八大排序之归并排序、计数排序

创作不易&#xff0c;感谢三连支持&#xff01;&#xff01; 一、归并排序 1.1 思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子…

微服务OAuth 2.1认证授权Demo方案(Spring Security 6)

文章目录 一、介绍二、auth微服务代码1. SecurityConfig2. UserDetailsService3. 总结 三、gateway微服务代码1. 统一处理CORS问题 四、content微服务代码1. controller2. SecurityConfig3. 解析JWT Utils4. 总结 五、一些坑 书接上文 微服务OAuth 2.1认证授权可行性方案(Sprin…

【软考高级信息系统项目管理师--第十五章:项目风险管理】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;软考高级–信息系统项目管理师 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 第十五章&#xff1a;项目风险管理 风险的属性风险的分类风险管理过程规划风险管理…

Linux——开发工具的使用

目录 Linux软件包管理器 yum rzsz Linux编辑器——vim vim的使用 vim的基本操作 命令模式的常见命令 底行模式的常见命令 vim是需要配置的 Linux编译器——gcc/g 预处理 编译 汇编 链接 函数库 Linux项目自动化构建工具 make/makefile make原理 项目清理 Linux调试器g…