├── .github
└── stale.yml
├── .gitignore
├── .readthedocs.yaml
├── .vscode
└── settings.json
├── LICENSE
├── README.md
├── assets
└── GIT.emmx
├── cmakes
├── .clang-format
├── .gitignore
├── condition
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── build.sh
│ └── main.cpp
├── grammar
│ ├── .clang-format
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── libs
│ │ ├── hellolibrary.cc
│ │ └── hellolibrary.h
│ └── main.cc
├── hello
│ ├── CMakeLists.txt
│ └── main.cpp
├── optimization
│ ├── .clang-format
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── main.cpp
│ └── run.sh
└── submodules
│ ├── CMakeLists.txt
│ ├── exec
│ ├── CMakeLists.txt
│ └── main.cc
│ ├── libs
│ ├── CMakeLists.txt
│ ├── common
│ │ ├── CMakeLists.txt
│ │ ├── common.cc
│ │ ├── common.h
│ │ └── mm.h
│ ├── ma
│ │ ├── CMakeLists.txt
│ │ ├── helloma.cc
│ │ └── helloma.h
│ └── mb
│ │ ├── CMakeLists.txt
│ │ ├── himb.cc
│ │ └── himb.h
│ └── tests
│ └── CMakeLists.txt
├── docs
├── clang-format
│ ├── clion.md
│ ├── generate.md
│ └── index.md
├── cmake
│ ├── basic.md
│ ├── condition.md
│ ├── crosscompile.md
│ ├── index.md
│ ├── install.md
│ ├── minimum.md
│ ├── opencv.md
│ ├── optimization.md
│ └── submodule.md
├── cplusplus
│ ├── C++标准.md
│ ├── advanced
│ │ ├── class
│ │ │ ├── imgs
│ │ │ │ ├── access_control.png
│ │ │ │ ├── base_access.png
│ │ │ │ └── multiple_inheritance.png
│ │ │ ├── static成员.md
│ │ │ ├── 基本类结构.md
│ │ │ ├── 复制和移动操作.md
│ │ │ ├── 嵌套类定义.md
│ │ │ ├── 成员函数概述.md
│ │ │ ├── 成员访问控制.md
│ │ │ ├── 显式默认和删除函数.md
│ │ │ ├── 构造器概述.md
│ │ │ ├── 析构器.md
│ │ │ ├── 类、结构体和共同体.md
│ │ │ ├── 类定义.md
│ │ │ ├── 结构体.md
│ │ │ └── 继承.md
│ │ ├── reference
│ │ │ ├── lvalue和rvalue.md
│ │ │ ├── 引用概述.md
│ │ │ ├── 引用类型函数操作.md
│ │ │ └── 指针引用.md
│ │ ├── smart-pointer
│ │ │ ├── imgs
│ │ │ │ ├── shared_ptr.png
│ │ │ │ └── unique_ptr.png
│ │ │ ├── shared_ptr.md
│ │ │ ├── unique_ptr.md
│ │ │ ├── weak_ptr.md
│ │ │ ├── 使用原始指针还是智能指针.md
│ │ │ └── 智能指针类型.md
│ │ ├── stl
│ │ │ ├── STL概述.md
│ │ │ ├── [shuffle]随机重排列.md
│ │ │ ├── array.md
│ │ │ ├── find.md
│ │ │ ├── for_each.md
│ │ │ ├── map.md
│ │ │ ├── queue.md
│ │ │ ├── sort.md
│ │ │ ├── stack.md
│ │ │ └── vector.md
│ │ └── template
│ │ │ ├── 函数模板.md
│ │ │ ├── 模板和名称解析.md
│ │ │ └── 模板概述.md
│ ├── faq
│ │ ├── ISO C++ forbids converting a string constant to char*.md
│ │ └── multiple-definition-of.md
│ ├── get-started
│ │ ├── basic-concepts
│ │ │ ├── imgs
│ │ │ │ ├── Comp-link.png
│ │ │ │ ├── include.png
│ │ │ │ └── overloading_consideration.png
│ │ │ ├── 临时对象.md
│ │ │ ├── 作用域.md
│ │ │ ├── 函数.md
│ │ │ ├── 初始化.md
│ │ │ ├── 声明和定义.md
│ │ │ ├── 头文件.md
│ │ │ ├── 常量.md
│ │ │ ├── 指针引用.md
│ │ │ ├── 数组.md
│ │ │ ├── 程序终止.md
│ │ │ ├── 类型别名设置.md
│ │ │ └── 链接.md
│ │ ├── keywords
│ │ │ ├── cv限定符.md
│ │ │ ├── enum.md
│ │ │ ├── main.md
│ │ │ ├── namespace.md
│ │ │ ├── nullptr.md
│ │ │ └── size_t.md
│ │ ├── operator-overload
│ │ │ ├── 一元运算符重载.md
│ │ │ ├── 下标运算符重载.md
│ │ │ ├── 二元运算符重载.md
│ │ │ ├── 函数调用运算符重载.md
│ │ │ ├── 操作符重载概述.md
│ │ │ └── 赋值运算符重载.md
│ │ ├── pointer-array
│ │ │ ├── const指针和volatile指针.md
│ │ │ ├── 二维数组和二级指针.md
│ │ │ ├── 原始指针.md
│ │ │ ├── 原始数组.md
│ │ │ ├── 指针名和数组名的区别.md
│ │ │ ├── 指针和数组.md
│ │ │ ├── 指针常量和常量指针.md
│ │ │ ├── 指针数组和数组指针.md
│ │ │ └── 指针类型.md
│ │ └── type-cast-deduce
│ │ │ ├── auto.md
│ │ │ ├── decltype.md
│ │ │ ├── imgs
│ │ │ ├── decltype.png
│ │ │ └── promotion.png
│ │ │ ├── void类型.md
│ │ │ ├── 基本类型.md
│ │ │ ├── 字符串类型.md
│ │ │ ├── 标准转换.md
│ │ │ ├── 现代类型转换.md
│ │ │ ├── 用户定义的类型转换.md
│ │ │ └── 类型概述.md
│ ├── operate
│ │ └── 计时.md
│ └── 学习C++之路.md
├── gtest
│ ├── compile.md
│ ├── index.md
│ ├── primer.md
│ └── summary.md
├── index.md
├── libjpeg
│ ├── index.md
│ └── ubuntu-compile.md
├── matplotlib
│ ├── 3d绘图.md
│ ├── imgs
│ │ ├── anatomy.png
│ │ ├── axes-2-2.png
│ │ ├── contour_1.png
│ │ ├── contour_2.png
│ │ ├── contour_3.png
│ │ ├── contour_4.png
│ │ ├── contour_5.png
│ │ ├── coordinate-3d.png
│ │ ├── curve-3d.png
│ │ ├── figure-1.png
│ │ ├── figure-2.png
│ │ ├── figure-3.png
│ │ ├── figure-suptitle.png
│ │ ├── fmt-color.png
│ │ ├── fmt-line.png
│ │ ├── fmt-marker.png
│ │ ├── gray-2-3.png
│ │ ├── gray.png
│ │ ├── line-chart.png
│ │ ├── line-legend-1.png
│ │ ├── line-text.png
│ │ ├── line2d-properties-1.png
│ │ ├── line2d-properties-2.png
│ │ ├── line_spots.png
│ │ ├── mat_image.png
│ │ ├── multi-scatter.png
│ │ ├── pie-1.png
│ │ ├── pie-2.png
│ │ ├── pie-3.png
│ │ ├── pie-4.png
│ │ ├── pie-5.png
│ │ ├── pie-6.png
│ │ ├── plot-x-y-+.png
│ │ ├── plot-x-y.png
│ │ ├── plot-y.png
│ │ ├── scatter-3d.png
│ │ ├── single-scatter.png
│ │ ├── sphx_glr_pyplot_001.png
│ │ ├── sphx_glr_pyplot_002.png
│ │ ├── sphx_glr_pyplot_003.png
│ │ ├── sphx_glr_pyplot_004.png
│ │ ├── sphx_glr_pyplot_005.png
│ │ ├── sphx_glr_pyplot_006.png
│ │ ├── sphx_glr_pyplot_007.png
│ │ ├── sphx_glr_pyplot_008.png
│ │ ├── sphx_glr_pyplot_009.png
│ │ ├── sphx_glr_pyplot_010.png
│ │ ├── subplot-1-2-2.png
│ │ ├── surface-3d.png
│ │ ├── two_y_axes.png
│ │ ├── unorder.png
│ │ ├── xaxis.png
│ │ ├── xlim_xticks.png
│ │ └── xlim_xticks_1.png
│ ├── y轴坐标错乱.md
│ ├── 中文乱码.md
│ ├── 图像读取-显示和保存.md
│ ├── 属性配置.md
│ ├── 引言.md
│ ├── 手动设置轴刻度间隔.md
│ ├── 折线图.md
│ ├── 指定轴取值范围以及显示轴刻度.md
│ ├── 散点图.md
│ ├── 矩阵显示.md
│ ├── 等高线图.md
│ ├── 绘图关键概念Figure和Axes.md
│ ├── 设置双Y轴.md
│ ├── 译-Pyplot教程.md
│ └── 饼图.md
├── mnn
│ ├── compile.md
│ ├── convert.md
│ ├── dataformat.md
│ ├── imageprocess.md
│ ├── index.md
│ ├── infer.md
│ └── quantization.md
├── numpy
│ ├── troubleshooting.md
│ ├── 元素累加.md
│ ├── 增加或者减少一维.md
│ ├── 提取数组中属于某一条件的数据.md
│ ├── 数据保存和加载.md
│ └── 限制取值范围.md
├── opencv
│ ├── configure
│ │ ├── 3.4.2
│ │ │ ├── Contrib-源码安装.md
│ │ │ ├── 测试.md
│ │ │ └── 源码安装.md
│ │ ├── 4.0.1
│ │ │ ├── 安装.md
│ │ │ ├── 测试.md
│ │ │ └── 编译OpenCV4Android.md
│ │ ├── 4.1.0
│ │ │ ├── 安装.md
│ │ │ └── 配置及测试.md
│ │ ├── 4.2.0
│ │ │ ├── 安装.md
│ │ │ └── 配置及测试.md
│ │ ├── 4.4.0
│ │ │ └── 安装.md
│ │ ├── 4.7.0
│ │ │ └── INSTALL.md
│ │ ├── SSH-OpenCV-远程图像显示.md
│ │ └── python
│ │ │ ├── anaconda配置.md
│ │ │ ├── opencv-python.md
│ │ │ └── pycharm.md
│ ├── draw
│ │ ├── fillPoly.md
│ │ ├── imgs
│ │ │ ├── freetype.png
│ │ │ ├── line.png
│ │ │ ├── rectangle.png
│ │ │ └── text.png
│ │ ├── line.md
│ │ ├── rectangle.md
│ │ ├── text.md
│ │ └── 绘制中文字符.md
│ ├── index.md
│ └── process
│ │ ├── advanced
│ │ └── contour.md
│ │ ├── base
│ │ ├── Point_.md
│ │ ├── Scalar_.md
│ │ ├── cartToPolar.md
│ │ ├── convertTo.md
│ │ ├── copyMakeBorder.md
│ │ ├── h264-mpeg4.md
│ │ ├── imgs
│ │ │ ├── affine
│ │ │ │ ├── Warp_Affine_Tutorial_Theory_0.jpg
│ │ │ │ ├── X.png
│ │ │ │ ├── affine-1.png
│ │ │ │ ├── affine-2.png
│ │ │ │ ├── affine-matrix.png
│ │ │ │ ├── affine-result.png
│ │ │ │ ├── compute.png
│ │ │ │ ├── get-rotation-matrix.png
│ │ │ │ ├── rotate-python.png
│ │ │ │ └── warp-affine.png
│ │ │ ├── cartToPolar.png
│ │ │ ├── constraint_border.png
│ │ │ ├── contrast.jpg
│ │ │ ├── convert-to.png
│ │ │ ├── kernel.png
│ │ │ ├── normalize
│ │ │ │ ├── norm-type-1.png
│ │ │ │ └── norm-type-2.png
│ │ │ ├── replicate_border.png
│ │ │ ├── sample-edge-second-derivative.jpg
│ │ │ └── thresh
│ │ │ │ ├── Threshold_Tutorial_Theory_Base_Figure.png
│ │ │ │ ├── Threshold_Tutorial_Theory_Binary.png
│ │ │ │ ├── Threshold_Tutorial_Theory_Binary_Inverted.png
│ │ │ │ ├── Threshold_Tutorial_Theory_Truncate.png
│ │ │ │ ├── Threshold_Tutorial_Theory_Zero.png
│ │ │ │ ├── Threshold_Tutorial_Theory_Zero_Inverted.png
│ │ │ │ ├── thresh-binary-inv.png
│ │ │ │ ├── thresh-binary.png
│ │ │ │ ├── thresh-tozero-inv.png
│ │ │ │ ├── thresh-tozero.png
│ │ │ │ └── thresh-truncate.png
│ │ ├── normalize.md
│ │ ├── threshold.md
│ │ ├── vconcat-hconcat.md
│ │ ├── 仿射变换.md
│ │ ├── 保存图像数据为字节文件.md
│ │ ├── 单目标追踪.md
│ │ ├── 去除小黑点.md
│ │ ├── 对比度增强.md
│ │ ├── 运行时间统计.md
│ │ └── 非局部均值去噪.md
│ │ ├── feature
│ │ ├── Understanding-Features.md
│ │ ├── imgs
│ │ │ ├── matcher
│ │ │ │ ├── knnmatch_sift.png
│ │ │ │ └── match_sift.png
│ │ │ └── sift
│ │ │ │ ├── sift_dog.jpg
│ │ │ │ ├── sift_keypoints-gray.jpg
│ │ │ │ ├── sift_keypoints.jpg
│ │ │ │ └── sift_local_extrema.jpg
│ │ ├── sift.md
│ │ └── 特征匹配.md
│ │ └── filter
│ │ ├── canny.md
│ │ ├── filter2d.md
│ │ ├── imgs
│ │ ├── Laplace_Operator_Tutorial_Theory_Previous.jpg
│ │ ├── Laplace_Operator_Tutorial_Theory_ddIntensity.jpg
│ │ ├── canny.png
│ │ ├── filter2d.png
│ │ ├── gaussian-filter.png
│ │ ├── gradient-compute.png
│ │ ├── gradient-like-compute.png
│ │ ├── gradient.png
│ │ ├── kernel.png
│ │ ├── laplacian-1.png
│ │ ├── laplacian-2.png
│ │ ├── laplacian-3.png
│ │ ├── laplacian-kernel.png
│ │ ├── laplacian-math.png
│ │ ├── replicate_border.png
│ │ ├── sample-edge-second-derivative.jpg
│ │ ├── scharr-1.png
│ │ ├── scharr-2.png
│ │ ├── scharr-3.png
│ │ ├── scharr-kernel.png
│ │ ├── sobel-1.png
│ │ ├── sobel-2.png
│ │ ├── sobel-3.png
│ │ ├── sobel-horizontal.png
│ │ └── sobel-vertical.png
│ │ ├── laplacian.md
│ │ ├── scharr.md
│ │ └── sobel.md
├── python
│ ├── grammar
│ │ ├── abc.md
│ │ ├── around.md
│ │ ├── collections-defaultdict.md
│ │ ├── collections-deque.md
│ │ ├── easydict.md
│ │ ├── enumerate.md
│ │ ├── f-strings.md
│ │ ├── imgs
│ │ │ ├── decorator.png
│ │ │ ├── tqdm-1.gif
│ │ │ ├── tqdm-2.gif
│ │ │ ├── tqdm-3.gif
│ │ │ └── xml.png
│ │ ├── itertools-product.md
│ │ ├── json.md
│ │ ├── list.md
│ │ ├── logging.md
│ │ ├── monkey-patch.md
│ │ ├── pprint.md
│ │ ├── slice.md
│ │ ├── tqdm.md
│ │ ├── xml.md
│ │ ├── xmltodict.md
│ │ ├── yacs.md
│ │ ├── 模块和包.md
│ │ ├── 类操作.md
│ │ └── 装饰器.md
│ ├── tool
│ │ ├── converage.md
│ │ ├── fire.md
│ │ ├── pip.md
│ │ ├── pnno.md
│ │ ├── pytest.md
│ │ ├── requirements.md
│ │ ├── setup.md
│ │ └── 打包和分发Python程序.md
│ └── troubleshooting.md
├── pytorch
│ ├── cuda
│ │ ├── benchmark.md
│ │ ├── empty_cache.md
│ │ ├── 安装哪个版本的CUDA.md
│ │ ├── 指定哪张卡运行.md
│ │ └── 监控显存使用.md
│ ├── grammar
│ │ ├── AdaptiveMaxPool-AdaptiveAvgPool.md
│ │ ├── AlexNet.md
│ │ ├── LeNet5.md
│ │ ├── clamp.md
│ │ ├── conv-pool.md
│ │ ├── hook-获取运行时中间层计算结果.md
│ │ ├── imgs
│ │ │ ├── alexnet-500.png
│ │ │ ├── alexnet-loss-500.png
│ │ │ ├── mnist.png
│ │ │ ├── spp-pretrained-acc.png
│ │ │ └── spp-pretrained-loss.png
│ │ ├── index_fill.md
│ │ ├── nonzero.md
│ │ ├── onehot.md
│ │ ├── precision.md
│ │ ├── softmax.md
│ │ ├── tensor.md
│ │ └── transpose-permute.md
│ ├── index.md
│ ├── tool
│ │ └── visualize.md
│ ├── train
│ │ ├── distributeddataparallel.md
│ │ ├── imgs
│ │ │ ├── spp-pretrained-acc.png
│ │ │ └── spp-pretrained-loss.png
│ │ ├── 为什么推荐使用static_dict方式保存模型.md
│ │ ├── 加载部分预训练模型.md
│ │ ├── 固定部分参数进行训练.md
│ │ ├── 查询模型参数总数.md
│ │ ├── 自定义损失函数.md
│ │ └── 译-保存和加载模型.md
│ └── troubleshooting.md
├── requirements.txt
├── stb
│ └── index.md
└── torchvision
│ ├── ImageFolder.md
│ ├── concatdataset.md
│ ├── imgs
│ ├── cifar-sample-4.png
│ ├── fivecrop.png
│ ├── preprocess.png
│ ├── sphx_glr_data_loading_tutorial_001.png
│ ├── sphx_glr_data_loading_tutorial_004.png
│ ├── voc-aeroplane.png
│ └── voc-dataloader.png
│ ├── ten-crops.md
│ ├── 加载数据集-批量以及转换操作.md
│ ├── 均值和方差.md
│ ├── 数据预处理.md
│ ├── 自定义数据集和预处理操作.md
│ ├── 自定义采样器.md
│ └── 采样器.md
├── imgs
├── VisionGuide.png
└── VisionGuide.svg
├── libjpeg
├── .gitignore
├── CMakeLists.txt
└── main.cpp
├── mkdocs.yml
├── patches
└── simhei.ttf
├── py
├── .gitignore
├── data_preprocessing
│ ├── __init__.py
│ ├── color.py
│ ├── compose.py
│ ├── crop.py
│ ├── erase.py
│ ├── flip.py
│ ├── resize.py
│ └── ten-crops.py
└── lr
│ ├── SmoothLabelCriterion.py
│ ├── __init__.py
│ ├── find_lr.py
│ ├── find_wd.py
│ ├── train_lr.py
│ ├── train_wd.py
│ └── util.py
├── requirements.txt
├── samples
├── GTestDemo
│ ├── .clang-format
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── gtest_main.cpp
│ └── gtest_two.cpp
├── OpenCVDemo
│ ├── .clang-format
│ ├── 3rdparty
│ │ └── opencv
│ ├── CMakeLists.txt
│ ├── cropped_lena.jpg
│ ├── lena.jpg
│ └── main.cpp
└── plantuml
│ ├── class.puml
│ ├── common.puml
│ └── version.puml
├── stb
├── .gitignore
├── CMakeLists.txt
├── assets
│ └── mnist_0.png
├── main.cpp
├── stb_image.h
└── stb_image_write.h
└── tools
├── createsamples
├── .vscode
│ ├── c_cpp_properties.json
│ ├── launch.json
│ └── tasks.json
├── CMakeLists.txt
├── createsamples.cpp
├── utility.cpp
└── utility.hpp
└── traincascade
├── .vscode
├── c_cpp_properties.json
└── settings.json
├── CMakeLists.txt
├── HOGfeatures.cpp
├── HOGfeatures.h
├── boost.cpp
├── boost.h
├── cascadeclassifier.cpp
├── cascadeclassifier.h
├── features.cpp
├── haarfeatures.cpp
├── haarfeatures.h
├── imagestorage.cpp
├── imagestorage.h
├── lbpfeatures.cpp
├── lbpfeatures.h
├── old_ml.hpp
├── old_ml_boost.cpp
├── old_ml_data.cpp
├── old_ml_inner_functions.cpp
├── old_ml_precomp.hpp
├── old_ml_tree.cpp
├── traincascade.cpp
└── traincascade_features.h
/.github/stale.yml:
--------------------------------------------------------------------------------
1 | # Number of days of inactivity before an issue becomes stale
2 | daysUntilStale: 60
3 | # Number of days of inactivity before a stale issue is closed
4 | daysUntilClose: 7
5 | # Issues with these labels will never be considered stale
6 | exemptLabels:
7 | - pinned
8 | - security
9 | # Label to use when marking an issue as stale
10 | staleLabel: wontfix
11 | # Comment to post when marking an issue as stale. Set to `false` to disable
12 | markComment: >
13 | This issue has been automatically marked as stale because it has not had
14 | recent activity. It will be closed if no further activity occurs. Thank you
15 | for your contributions.
16 | # Comment to post when closing a stale issue. Set to `false` to disable
17 | closeComment: false
--------------------------------------------------------------------------------
/.readthedocs.yaml:
--------------------------------------------------------------------------------
1 | # .readthedocs.yaml
2 | # Read the Docs configuration file
3 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
4 |
5 | # Required
6 | version: 2
7 |
8 | mkdocs:
9 | configuration: mkdocs.yml
10 |
11 | # Optionally set the version of Python and requirements required to build your docs
12 | python:
13 | version: 3.8
14 | install:
15 | - requirements: docs/requirements.txt
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "cmake.sourceDirectory": "${workspaceFolder}/cmakes/submodules/tests"
3 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | 语言:
3 | 🇨🇳
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | «VisionGuide»记录了视觉相关的编程语法、计算框架以及视觉库使用
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | ## 内容列表
23 |
24 | - [内容列表](#内容列表)
25 | - [主要维护人员](#主要维护人员)
26 | - [参与贡献方式](#参与贡献方式)
27 | - [许可证](#许可证)
28 |
29 | ## 主要维护人员
30 |
31 | * zhujian - *Initial work* - [zjykzj](https://github.com/zjykzj)
32 |
33 | ## 参与贡献方式
34 |
35 | 欢迎任何人的参与!打开[issue](https://github.com/ZJDoc/VisionGuide/issues)或提交合并请求。
36 |
37 | 注意:
38 |
39 | * `GIT`提交,请遵守[Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0-beta.4/)规范
40 | * 语义版本化,请遵守[Semantic Versioning 2.0.0](https://semver.org)规范
41 | * `README`编写,请遵守[standard-readme](https://github.com/RichardLitt/standard-readme)规范
42 |
43 | ## 许可证
44 |
45 | [Apache License 2.0](LICENSE) © 2021 zjykzj
--------------------------------------------------------------------------------
/assets/GIT.emmx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZJDoc/VisionGuide/2bf535f664054a93bc830dde736c97d6cab8d5fb/assets/GIT.emmx
--------------------------------------------------------------------------------
/cmakes/condition/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 3.16)
2 | project(condition)
3 |
4 | set(CMAKE_CXX_STANDARD 11)
5 |
6 | set(CON1 OFF)
7 | set(CON2 "con2")
8 |
9 | if (NOT CON1)
10 | MESSAGE(STATUS "con1 is ${CON1}")
11 | endif ()
12 |
13 | if (CON1)
14 | MESSAGE(STATUS "con1 is ${CON1}")
15 | elseif (CON2 MATCHES "con2")
16 | MESSAGE(STATUS "con2 is ${CON2}")
17 | endif ()
18 |
19 | if (CON3)
20 | MESSAGE(STATUS "con3 is ${CON3}")
21 | endif ()
22 |
23 | add_definitions(-DAHAH -DHAHA)
24 |
25 | add_executable(condition main.cpp)
26 |
--------------------------------------------------------------------------------
/cmakes/condition/build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -eux
4 |
5 | BUILD_DIR=build/
6 | if [[ ! -d "${BUILD_DIR}" ]]; then
7 | mkdir -p ${BUILD_DIR}
8 | fi
9 |
10 | cd ${BUILD_DIR}
11 | cmake -DCON3=ON ../
12 | make
13 | ./condition
--------------------------------------------------------------------------------
/cmakes/condition/main.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | int main() {
4 | #ifdef HAHA
5 | std::cout <<"Hello HAHA"<
8 |
9 | void HelloLibrary::hello() {
10 | std::cout << "Hello World, two" << std::endl;
11 | }
12 |
--------------------------------------------------------------------------------
/cmakes/grammar/libs/hellolibrary.h:
--------------------------------------------------------------------------------
1 | //
2 | // Created by zj on 23-3-21.
3 | //
4 |
5 | #ifndef HELLO_LIBS_HELLOLIBRARY_H_
6 | #define HELLO_LIBS_HELLOLIBRARY_H_
7 |
8 | class HelloLibrary {
9 |
10 | public:
11 | HelloLibrary() = default;
12 | ~HelloLibrary() = default;
13 |
14 | void hello();
15 | };
16 |
17 | #endif//HELLO_LIBS_HELLOLIBRARY_H_
18 |
--------------------------------------------------------------------------------
/cmakes/grammar/main.cc:
--------------------------------------------------------------------------------
1 | //
2 | // Created by zj on 23-3-21.
3 | //
4 |
5 | #include
6 |
7 | #include "libs/hellolibrary.h"
8 |
9 | int main(int argc, char* argv[]) {
10 | std::cout << "Hello World" << std::endl;
11 |
12 | HelloLibrary hello_library;
13 | hello_library.hello();
14 |
15 | return 0;
16 | }
--------------------------------------------------------------------------------
/cmakes/hello/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 3.16)
2 | project(hello)
3 |
4 | set(CMAKE_CXX_STANDARD 11)
5 |
6 | add_executable(hello main.cpp)
--------------------------------------------------------------------------------
/cmakes/hello/main.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | int main() {
4 | std::cout << "Hello, World!" << std::endl;
5 | return 0;
6 | }
7 |
--------------------------------------------------------------------------------
/cmakes/optimization/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 3.16)
2 | project(hello)
3 |
4 | set(CMAKE_CXX_STANDARD 11)
5 |
6 | add_executable(hello main.cpp)
7 |
8 | IF (NOT DEFINED ENV{CMAKE_INSTALL_PREFIX})
9 | MESSAGE(STATUS "CMAKE_INSTALL_PREFIX not defined")
10 | set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install)
11 | ENDIF()
12 | MESSAGE(STATUS "output: ${CMAKE_INSTALL_PREFIX}")
13 | install(TARGETS hello RUNTIME DESTINATION bin)
--------------------------------------------------------------------------------
/cmakes/optimization/main.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | int main() {
4 | std::cout << "Hello, World!" << std::endl;
5 | return 0;
6 | }
7 |
--------------------------------------------------------------------------------
/cmakes/optimization/run.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -eux
4 |
5 | mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX=../install ..
6 |
7 | make && make install && cd ..
8 |
--------------------------------------------------------------------------------
/cmakes/submodules/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 3.16)
2 | project(SubModules)
3 |
4 | # 目标处理器架构
5 | MESSAGE(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
6 |
7 | # 安装路径前缀
8 | set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install)
9 | MESSAGE(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
10 | # 可执行程序运行时搜索路径
11 | set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_SYSTEM_PROCESSOR}")
12 | set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
13 |
14 | # 设置动态库名
15 | set(BUILD_COMMON COMMON)
16 | set(BUILD_MA MA)
17 | set(BUILD_MB MB)
18 | # 设置可执行文件名
19 | set(BUILD_MAIN main)
20 |
21 | MESSAGE(STATUS "=> BUILD ...")
22 | # 编译库目录
23 | add_subdirectory(libs)
24 | # 编译测试目录
25 | add_subdirectory(tests)
26 | # 编译可执行文件目录
27 | add_subdirectory(exec)
28 |
29 | MESSAGE(STATUS "=> INSTALL ...")
30 | install(TARGETS ${BUILD_COMMON} ${BUILD_MA} ${BUILD_MB} ${BUILD_MAIN}
31 | RUNTIME DESTINATION bin
32 | LIBRARY DESTINATION lib/${CMAKE_SYSTEM_PROCESSOR}
33 | ARCHIVE DESTINATION lib
34 | PUBLIC_HEADER DESTINATION include
35 | )
36 |
--------------------------------------------------------------------------------
/cmakes/submodules/exec/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 3.16)
2 | project(Exec VERSION 0.1.0 LANGUAGES C CXX)
3 |
4 | set(CMAKE_C_STANDARD ${CMAKE_C_STANDARD})
5 | set(CMAKE_CXX_STANDARD 17)
6 | MESSAGE(STATUS "CMAKE_C_STANDARD: ${CMAKE_C_STANDARD}")
7 | MESSAGE(STATUS "CMAKE_CXX_STANDARD: ${CMAKE_CXX_STANDARD}")
8 |
9 | # 设置C++编译器
10 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe -std=c99")
11 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pipe -std=c++17")
12 | MESSAGE(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
13 | MESSAGE(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
14 |
15 | file(GLOB_RECURSE FILES_RECURSE . "*.cc")
16 | MESSAGE(STATUS "FILES_RECURSE: ${FILES_RECURSE}")
17 |
18 | include_directories(../libs/common)
19 | include_directories(../libs/ma)
20 | include_directories(../libs/mb)
21 |
22 | add_executable(${BUILD_MAIN} ${FILES_RECURSE})
23 | #target_link_libraries(main PRIVATE MA MB COMMON)
24 | target_link_libraries(${BUILD_MAIN} PRIVATE ${BUILD_MA} ${BUILD_MB} ${BUILD_COMMON})
25 |
--------------------------------------------------------------------------------
/cmakes/submodules/exec/main.cc:
--------------------------------------------------------------------------------
1 | //
2 | // Created by zj on 23-3-22.
3 | //
4 |
5 | #include
6 |
7 | #include "common.h"
8 | #include "helloma.h"
9 | #include "himb.h"
10 |
11 | int main(int argc, char* argv[]) {
12 | std::cout << "Hello main" << std::endl;
13 |
14 | HelloMa ma;
15 | ma.Hello();
16 |
17 | HiMb mb;
18 | mb.Hi(3, 4);
19 |
20 | Common cm;
21 | std::cout << cm.a_plus_b(5, -3) << std::endl;
22 |
23 | return 0;
24 | }
--------------------------------------------------------------------------------
/cmakes/submodules/libs/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 3.16)
2 | project(Libs)
3 |
4 | add_subdirectory(common)
5 | add_subdirectory(ma)
6 | add_subdirectory(mb)
7 |
--------------------------------------------------------------------------------
/cmakes/submodules/libs/common/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 3.16)
2 | project(Common VERSION 0.1.0 LANGUAGES C CXX)
3 |
4 | set(CMAKE_C_STANDARD ${CMAKE_C_STANDARD})
5 | set(CMAKE_CXX_STANDARD 17)
6 | MESSAGE(STATUS "CMAKE_C_STANDARD: ${CMAKE_C_STANDARD}")
7 | MESSAGE(STATUS "CMAKE_CXX_STANDARD: ${CMAKE_CXX_STANDARD}")
8 |
9 | # 设置C++编译器
10 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe -std=c99")
11 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pipe -std=c++17")
12 | MESSAGE(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
13 | MESSAGE(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
14 |
15 | file(GLOB_RECURSE FILES_RECURSE . "*.cc")
16 | MESSAGE(STATUS "FILES_RECURSE: ${FILES_RECURSE}")
17 |
18 | MESSAGE(STATUS "BUILD_COMMON: ${BUILD_COMMON}")
19 | add_library(${BUILD_COMMON} SHARED ${FILES_RECURSE})
20 | #set_target_properties(${BUILD_COMMON} PROPERTIES PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/*.h)
21 |
22 | install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DESTINATION include FILES_MATCHING PATTERN "*.h")
23 |
--------------------------------------------------------------------------------
/cmakes/submodules/libs/common/common.cc:
--------------------------------------------------------------------------------
1 | //
2 | // Created by zj on 23-3-22.
3 | //
4 |
5 | #include "common.h"
6 | int Common::a_plus_b(int a, int b) {
7 | return a + b;
8 | }
9 |
--------------------------------------------------------------------------------
/cmakes/submodules/libs/common/common.h:
--------------------------------------------------------------------------------
1 | //
2 | // Created by zj on 23-3-22.
3 | //
4 |
5 | #ifndef SUBMODULES_SUBMODULES_LIBS_COMMON_COMMON_H_
6 | #define SUBMODULES_SUBMODULES_LIBS_COMMON_COMMON_H_
7 |
8 | class Common {
9 |
10 | public:
11 | Common() = default;
12 | ~Common() = default;
13 |
14 | int a_plus_b(int a, int b);
15 | };
16 |
17 | #endif//SUBMODULES_SUBMODULES_LIBS_COMMON_COMMON_H_
18 |
--------------------------------------------------------------------------------
/cmakes/submodules/libs/common/mm.h:
--------------------------------------------------------------------------------
1 | //
2 | // Created by zj on 23-3-22.
3 | //
4 |
5 | #ifndef SUBMODULES_SUBMODULES_LIBS_COMMON_MM_H_
6 | #define SUBMODULES_SUBMODULES_LIBS_COMMON_MM_H_
7 |
8 | #include
9 |
10 | inline std::string GetMM() {
11 | return "Hello MM";
12 | }
13 |
14 | #endif//SUBMODULES_SUBMODULES_LIBS_COMMON_MM_H_
15 |
--------------------------------------------------------------------------------
/cmakes/submodules/libs/ma/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 3.16)
2 | project(Ma VERSION 0.1.0 LANGUAGES C CXX)
3 |
4 | set(CMAKE_C_STANDARD ${CMAKE_C_STANDARD})
5 | set(CMAKE_CXX_STANDARD 17)
6 | MESSAGE(STATUS "CMAKE_C_STANDARD: ${CMAKE_C_STANDARD}")
7 | MESSAGE(STATUS "CMAKE_CXX_STANDARD: ${CMAKE_CXX_STANDARD}")
8 |
9 | # 设置C++编译器
10 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe -std=c99")
11 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pipe -std=c++17")
12 | MESSAGE(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
13 | MESSAGE(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
14 |
15 | file(GLOB_RECURSE FILES_RECURSE . "*.cc")
16 | MESSAGE(STATUS "FILES_RECURSE: ${FILES_RECURSE}")
17 |
18 | include_directories(../common)
19 |
20 | MESSAGE(STATUS "BUILD_MA: ${BUILD_MA}")
21 | add_library(${BUILD_MA} SHARED ${FILES_RECURSE})
22 | set_target_properties(${BUILD_MA} PROPERTIES PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/helloma.h)
23 |
24 | install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DESTINATION include FILES_MATCHING PATTERN "*.h")
25 |
26 |
--------------------------------------------------------------------------------
/cmakes/submodules/libs/ma/helloma.cc:
--------------------------------------------------------------------------------
1 | //
2 | // Created by zj on 23-3-22.
3 | //
4 |
5 | #include "helloma.h"
6 |
7 | #include
8 |
9 | #include "mm.h"
10 |
11 | int HelloMa::Hello() {
12 | std::cout << "Hello MA" << std::endl;
13 | std::cout << GetMM() << std::endl;
14 |
15 | return 0;
16 | }
17 |
--------------------------------------------------------------------------------
/cmakes/submodules/libs/ma/helloma.h:
--------------------------------------------------------------------------------
1 | //
2 | // Created by zj on 23-3-22.
3 | //
4 |
5 | #ifndef HELLO_SUBMODULES_LIBS_MA_HELLOMA_H_
6 | #define HELLO_SUBMODULES_LIBS_MA_HELLOMA_H_
7 |
8 | class HelloMa {
9 | public:
10 | HelloMa() = default;
11 | ~HelloMa() = default;
12 |
13 | int Hello();
14 | };
15 |
16 | #endif//HELLO_SUBMODULES_LIBS_MA_HELLOMA_H_
17 |
--------------------------------------------------------------------------------
/cmakes/submodules/libs/mb/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 3.16)
2 | project(Mb VERSION 0.1.0 LANGUAGES C CXX)
3 |
4 | set(CMAKE_C_STANDARD ${CMAKE_C_STANDARD})
5 | set(CMAKE_CXX_STANDARD 17)
6 | MESSAGE(STATUS "CMAKE_C_STANDARD: ${CMAKE_C_STANDARD}")
7 | MESSAGE(STATUS "CMAKE_CXX_STANDARD: ${CMAKE_CXX_STANDARD}")
8 |
9 | # 设置C++编译器
10 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe -std=c99")
11 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pipe -std=c++17")
12 | MESSAGE(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
13 | MESSAGE(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
14 |
15 | file(GLOB_RECURSE FILES_RECURSE . "*.cc")
16 | MESSAGE(STATUS "FILES_RECURSE: ${FILES_RECURSE}")
17 |
18 | include_directories(../common)
19 |
20 | MESSAGE(STATUS "BUILD_MB: ${BUILD_MB}")
21 | add_library(${BUILD_MB} SHARED ${FILES_RECURSE})
22 | target_link_libraries(${BUILD_MB} PRIVATE ${BUILD_COMMON})
23 |
24 | install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DESTINATION include FILES_MATCHING PATTERN "*.h")
25 |
--------------------------------------------------------------------------------
/cmakes/submodules/libs/mb/himb.cc:
--------------------------------------------------------------------------------
1 | //
2 | // Created by zj on 23-3-22.
3 | //
4 |
5 | #include "himb.h"
6 |
7 | #include
8 |
9 | #include "common.h"
10 |
11 | int HiMb::Hi(int a, int b) {
12 | std::cout << "Hi MB" << std::endl;
13 |
14 | std::cout << "a = " << a << " b = " << b << std::endl;
15 | auto cm = Common();
16 | int r = cm.a_plus_b(a, b);
17 | std::cout << "result: " << r << std::endl;
18 |
19 | return 0;
20 | }
21 |
--------------------------------------------------------------------------------
/cmakes/submodules/libs/mb/himb.h:
--------------------------------------------------------------------------------
1 | //
2 | // Created by zj on 23-3-22.
3 | //
4 |
5 | #ifndef HELLO_SUBMODULES_LIBS_MB_HIMB_H_
6 | #define HELLO_SUBMODULES_LIBS_MB_HIMB_H_
7 |
8 | class HiMb {
9 |
10 | public:
11 | HiMb() = default;
12 | ~HiMb() = default;
13 |
14 | int Hi(int a, int b);
15 | };
16 |
17 | #endif//HELLO_SUBMODULES_LIBS_MB_HIMB_H_
18 |
--------------------------------------------------------------------------------
/cmakes/submodules/tests/CMakeLists.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZJDoc/VisionGuide/2bf535f664054a93bc830dde736c97d6cab8d5fb/cmakes/submodules/tests/CMakeLists.txt
--------------------------------------------------------------------------------
/docs/clang-format/clion.md:
--------------------------------------------------------------------------------
1 |
2 | # CLion配置
3 |
4 | ## 配置文件
5 |
6 | 将`.clang-format`放置到`CLion`工程根路径
7 |
8 | ## CLion配置
9 |
10 | * 点击菜单栏`File->Settings->Editor->Code Style`,打开`ClangFormat`设置
11 |
12 | 修改`C++`文件后使用快捷命令`ctrl+alt+L`即进行格式化操作
13 |
14 | * 点击菜单栏`File->Settings->Tools->Actions on Save`,选中`Reformat code / Optimize imports / Rearrange code`
15 |
16 | 这样修改文件后保存文件就可以自动格式化了
17 |
18 | ## 错误
19 |
20 | ```
21 | Error reading /home/zj/repos/VisionGuide/samples/GTestDemo/.clang-format:97:4: Invalid argument - unknown key 'Delimiter
22 | ```
23 |
24 | 当前解决方案:注释掉该选项
25 |
26 | ```
27 | #RawStringFormats:
28 | # - Delimiter: pb
29 | # Language: TextProto
30 | # BasedOnStyle: google
31 | ```
--------------------------------------------------------------------------------
/docs/clang-format/generate.md:
--------------------------------------------------------------------------------
1 |
2 | # 配置文件
3 |
4 | ## 安装
5 |
6 | 首先安装`clang-format`
7 |
8 | ```shell
9 | sudo apt install clang-format
10 | ```
11 |
12 | ## 配置
13 |
14 | 执行如下命令,生成`Google`风格`C++`配置文件:
15 |
16 | ```shell
17 | clang-format -style=google -dump-config > .clang-format
18 | ```
19 |
20 | 生成得到`YAML`格式配置文件`.clang-format`
21 |
22 | ## 修改
23 |
24 | 修改部分选项,更符合个人需求:
25 |
26 | 1. `tab`宽度从`8`修改为`4`
27 |
28 | ```
29 | #TabWidth: 8
30 | TabWidth: 4
31 | ```
32 |
33 | 2. `indent`宽度从`2`修改为`4`
34 |
35 | ```
36 | #IndentWidth: 2
37 | IndentWidth: 4
38 | ```
--------------------------------------------------------------------------------
/docs/clang-format/index.md:
--------------------------------------------------------------------------------
1 |
2 | # Clang-format
3 |
4 | `clang-format`是常用的格式化`C++`代码工具,支持多种代码规范(`Google Code Style/LLVM`等等),并且常用的开发工具(`CLion/VS/VS Code`)上均可配置
5 |
6 | ## 相关阅读
7 |
8 | * [Clang 16.0.0git documentation](https://clang.llvm.org/docs/index.html)
--------------------------------------------------------------------------------
/docs/cmake/basic.md:
--------------------------------------------------------------------------------
1 |
2 | # 基础语法
3 |
4 | * 具体示例可以查看:[grammar](../../cmakes/grammar/)
5 |
6 | ## 打印信息
7 |
8 | ```text
9 | message([] "message text" ...)
10 | ```
11 |
12 | * [Log a message.](https://cmake.org/cmake/help/latest/command/message.html?highlight=message)
13 |
14 | ## 文件操作
15 |
16 | ```text
17 | # 获取文件
18 | file({GLOB | GLOB_RECURSE} [...] [...])
19 | # 获取当前目录中的所有.cc文件
20 | file(GLOB FILES . "*.cc")
21 | # 递归获取当前目录中所有的.cc文件和.txt文件
22 | file(GLOB_RECURSE FILES_RECURSE . "*.cc" "*.txt")
23 | ```
24 |
25 | * [File manipulation command.](https://cmake.org/cmake/help/latest/command/file.html?highlight=file#command:file)
26 |
27 | ```text
28 | aux_source_directory( )
29 | # 获取指定路径下的所有源文件
30 | aux_source_directory(${CMAKE_SOURCE_DIR} SOURCES)
31 | MESSAGE(STATUS "SOURCES: ${SOURCES}")
32 | ```
33 |
34 | * [aux_source_directory](https://cmake.org/cmake/help/latest/command/aux_source_directory.html)
--------------------------------------------------------------------------------
/docs/cmake/crosscompile.md:
--------------------------------------------------------------------------------
1 |
2 | # 交叉编译
3 |
4 | ## aarch64
5 |
6 | ## Android
7 |
8 | * [Android CMake](https://developer.android.google.cn/ndk/guides/cmake#command-line_2)
--------------------------------------------------------------------------------
/docs/cmake/index.md:
--------------------------------------------------------------------------------
1 |
2 | # 引言
3 |
4 | 不知不觉已经写了好多的`CMakeLists.txt`文件,对于基本的`CMake`语法也有了简单的理解和使用,记录一下常用的内容。
5 |
6 | * [最小实现](./minimum.md)
7 | * [结构优化](./optimization.md)
8 | * [配置OpenCV](./opencv.md)
9 |
10 | ## 相关阅读
11 |
12 | * [CMake实践应用专题](https://www.zhihu.com/column/c_1369781372333240320)
13 | * 目前看到的比较全面的CMake教程,提供了文档介绍以及示例代码
14 | * 阅读代码,发现作者有一个很好的习惯,就是会给出大部分代码的释义
15 | * 另外代码仓库里面还有一个彩蛋(*关于clang-format*)
--------------------------------------------------------------------------------
/docs/cmake/install.md:
--------------------------------------------------------------------------------
1 |
2 | # make install
3 |
4 | ## 文档
5 |
6 | * [cmake应用:安装和打包](https://zhuanlan.zhihu.com/p/377131996)
7 | * [CMake之install方法的使用](https://zhuanlan.zhihu.com/p/102955723)
8 | * [【CMake 系列】(五)安装、打包与导出](https://blog.xizhibei.me/tags/CMake/)
9 |
10 | ## 可执行文件链接库文件
11 |
12 | * [链接选项RPATH以及在cmake和gcc中的使用](https://bewaremypower.github.io/2019/09/05/%E9%93%BE%E6%8E%A5%E9%80%89%E9%A1%B9RPATH%E4%BB%A5%E5%8F%8A%E5%9C%A8cmake%E5%92%8Cgcc%E4%B8%AD%E7%9A%84%E4%BD%BF%E7%94%A8/)
13 |
14 | ## 实现
15 |
16 | * [cmakes/submodules](https://github.com/ZJDoc/VisionGuide/tree/master/cmakes/submodules)
--------------------------------------------------------------------------------
/docs/cmake/minimum.md:
--------------------------------------------------------------------------------
1 |
2 | # 最小实现
3 |
4 | ## 目标
5 |
6 | 创建可执行文件,打印`Hello World`
7 |
8 | ## 源文件
9 |
10 | ```
11 | #include
12 |
13 | int main() {
14 | std::cout << "Hello, World!" << std::endl;
15 | return 0;
16 | }
17 | ```
18 |
19 | ## CMakeList.txt
20 |
21 | ```
22 | cmake_minimum_required(VERSION 3.16.0)
23 | project(hello)
24 |
25 | set(CMAKE_CXX_STANDARD 11)
26 |
27 | add_executable(hello main.cpp)
28 | ```
29 |
30 | ## 目录结构
31 |
32 | ```
33 | .
34 | ├── CMakeLists.txt
35 | └── main.cpp
36 | ```
37 |
38 | ## 编译&运行
39 |
40 | ```
41 | $ cmake .
42 | -- The C compiler identification is GNU 7.5.0
43 | -- The CXX compiler identification is GNU 7.5.0
44 | -- Check for working C compiler: /usr/bin/cc
45 | -- Check for working C compiler: /usr/bin/cc -- works
46 | -- Detecting C compiler ABI info
47 | -- Detecting C compiler ABI info - done
48 | -- Detecting C compile features
49 | -- Detecting C compile features - done
50 | -- Check for working CXX compiler: /usr/bin/c++
51 | -- Check for working CXX compiler: /usr/bin/c++ -- works
52 | -- Detecting CXX compiler ABI info
53 | -- Detecting CXX compiler ABI info - done
54 | -- Detecting CXX compile features
55 | -- Detecting CXX compile features - done
56 | -- Configuring done
57 | -- Generating done
58 | -- Build files have been written to: /home/zj/CLionProjects/hello
59 | $ make
60 | Scanning dependencies of target hello
61 | [ 50%] Building CXX object CMakeFiles/hello.dir/main.cpp.o
62 | [100%] Linking CXX executable hello
63 | [100%] Built target hello
64 | $ ./hello
65 | Hello, World!
66 | ```
--------------------------------------------------------------------------------
/docs/cmake/opencv.md:
--------------------------------------------------------------------------------
1 |
2 | # 配置OpenCV
3 |
4 |
--------------------------------------------------------------------------------
/docs/cmake/submodule.md:
--------------------------------------------------------------------------------
1 |
2 | # 子模块
3 |
4 | ## 场景
5 |
6 | 一个完整的工程中存在多个子目录,分别保存有库文件、运行文件和测试文件。分别创建三个子模块:
7 |
8 | 1. 在库目录中创建动态库
9 | 2. 在运行文件中创建可执行程序,链接动态库
10 | 3. 在测试文件中创建gtest测试程序,链接动态库
11 |
12 | ```text
13 | submodules
14 | ├── CMakeLists.txt
15 | ├── exec
16 | │ ├── CMakeLists.txt
17 | │ └── main.cc
18 | ├── libs
19 | │ ├── CMakeLists.txt
20 | │ ├── common
21 | │ │ ├── CMakeLists.txt
22 | │ │ ├── common.cc
23 | │ │ ├── common.h
24 | │ │ └── mm.h
25 | │ ├── ma
26 | │ │ ├── CMakeLists.txt
27 | │ │ ├── helloma.cc
28 | │ │ └── helloma.h
29 | │ └── mb
30 | │ ├── CMakeLists.txt
31 | │ ├── himb.cc
32 | │ └── himb.h
33 | └── tests
34 | └── CMakeLists.txt
35 | ```
36 |
37 | ## 实现
38 |
39 | * [cmakes/submodules](https://github.com/ZJDoc/VisionGuide/tree/master/cmakes/submodules)
40 |
41 | ## 相关阅读
42 |
43 | * [CMake多模块的构建方式](https://www.leadroyal.cn/p/781/)
44 | * [CMake应用:模块化及库依赖](https://zhuanlan.zhihu.com/p/373363335)
45 | * [Subdirectories, spliting code in CMake](https://codeiter.com/en/posts/subdirectories-spliting-code-in-cmake)
46 | * [CMake 管理多项目](https://zcteo.top/blog/CMake/002_CmakeMultiproject.html)
47 | * [使用子工程CMake](https://sfumecjf.github.io/cmake-examples-Chinese/02-sub-projects/A-basic/)
--------------------------------------------------------------------------------
/docs/cplusplus/C++标准.md:
--------------------------------------------------------------------------------
1 |
2 | # C++标准
3 |
4 | 参考:[C++ 的历史](https://zh.cppreference.com/w/cpp/language/history)
5 |
6 | `C++`标准一直在进步,从远到近有以下版本:
7 |
8 | * `C++98`
9 | * `C++03`
10 | * `C++11`
11 | * `C++14`
12 | * `C++17`
13 | * `C++20`
14 |
15 | ## 使用哪个标准
16 |
17 | 之前编译`OpenCV 4.0`的时候,发现其中一个新特征就是完全符合`C++11`标准,所以当前学习和使用`C++11`标准
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/class/imgs/access_control.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZJDoc/VisionGuide/2bf535f664054a93bc830dde736c97d6cab8d5fb/docs/cplusplus/advanced/class/imgs/access_control.png
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/class/imgs/base_access.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZJDoc/VisionGuide/2bf535f664054a93bc830dde736c97d6cab8d5fb/docs/cplusplus/advanced/class/imgs/base_access.png
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/class/imgs/multiple_inheritance.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZJDoc/VisionGuide/2bf535f664054a93bc830dde736c97d6cab8d5fb/docs/cplusplus/advanced/class/imgs/multiple_inheritance.png
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/class/static成员.md:
--------------------------------------------------------------------------------
1 |
2 | # static成员
3 |
4 | 参考:[Static Members (C++)](https://docs.microsoft.com/en-us/cpp/cpp/static-members-cpp?view=vs-2019)
5 |
6 | 类可以包含静态成员数据和成员函数。当一个数据成员声明为静态时,该类的所有对象只维护一个数据副本
7 |
8 | 静态数据成员不是给定类类型的对象的一部分。因此,静态数据成员的声明不被视为定义。数据成员在类作用域中声明,但定义在文件作用域中执行。这些静态成员具有外部链接。以下示例说明了这一点:
9 |
10 | ## 使用
11 |
12 | 可以引用静态数据成员而不引用类类型的对象
13 |
14 | ```
15 | long nBytes = BufferedOutput::bytecount;
16 | ```
17 |
18 | 也可以通过类对象引用
19 |
20 | ```
21 | BufferedOutput Console;
22 | long nBytes = Console.bytecount;
23 | ```
24 |
25 | ## 访问规则
26 |
27 | 静态数据成员受类成员访问规则的约束。对于私有定义的静态数据成员而言,只允许类成员函数和友元函数进行私有访问。例外情况是,不管静态数据成员的访问限制如何,都必须在文件作用域中定义它们。如果要显式初始化数据成员,则必须为该定义提供初始值设定项
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/class/嵌套类定义.md:
--------------------------------------------------------------------------------
1 |
2 | # 嵌套类定义
3 |
4 | 参考:[Nested Class Declarations](https://docs.microsoft.com/en-us/cpp/cpp/nested-class-declarations?view=vs-2019)
5 |
6 | ## 声明
7 |
8 | 一个类可以在另一个类的范围内声明,这样的类称为`嵌套类`。嵌套类被视为在封闭类的范围内,并可在该范围内使用。若要从其直接封闭作用域以外的作用域引用嵌套类,必须使用完全限定名
9 |
10 | ```
11 | class Cls {
12 | public:
13 | class NestA {
14 | public:
15 | void print() {
16 | std::cout << "NestA" << std::endl;
17 | }
18 | };
19 |
20 | class NestB {
21 | public:
22 | void print() {
23 | std::cout << "NestB" << std::endl;
24 | }
25 | };
26 |
27 | void print() {
28 | NestA nestA;
29 | NestB nestB;
30 | nestA.print();
31 | nestB.print();
32 | std::cout << "Cls" << std::endl;
33 | }
34 | };
35 |
36 | int main() {
37 | Cls cls;
38 | cls.print();
39 |
40 | Cls::NestA nestA;
41 | nestA.print();
42 | Cls::NestB nestB;
43 | nestB.print();
44 | }
45 | ```
46 |
47 | ## 使用
48 |
49 | * 对于封闭类中的成员/函数,嵌套类可以直接使用
50 | * 对于其他类的成员/函数,必须通过指针、引用或对象名来使用
51 | * 对于嵌套类的友元函数,其仅能访问嵌套类,不能访问封闭类
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/class/析构器.md:
--------------------------------------------------------------------------------
1 |
2 | # 析构器
3 |
4 | 参考:[Destructors (C++)](https://docs.microsoft.com/en-us/cpp/cpp/destructors-cpp?view=vs-2019)
5 |
6 | 当对象超出作用域时,自动调用析构器进行删除
7 |
8 | ## 声明
9 |
10 | * 不接受参数
11 | * 不返回值
12 | * 无法声明为`const,volatile`或`static`
13 | * 可以声明为`virtual`。使用虚拟析构函数,可以在不知道对象类型的情况下销毁对象 - 使用虚拟函数机制调用对象的正确析构函数。注意,析构函数也可以声明为抽象类的纯虚拟函数
14 |
15 | ## 使用
16 |
17 | 当以下事件发生时调用析构器:
18 |
19 | * 具有块作用域的本地(自动)对象超出作用域
20 | * 使用`new`运算符分配的对象使用`delete`显式释放
21 | * 临时对象的生存期结束
22 | * 程序结束后为全局或静态对象调用析构器
23 | * 使用析构函数的完全限定名显式调用
24 |
25 | 使用限制如下:
26 |
27 | * 无法获取析构器地址
28 | * 派生类无法继承基类的析构器
29 |
30 | ## 调用顺序
31 |
32 | * 首先调用对象类的析构器,执行函数体
33 | * `nonstatic`成员对象的析构器以声明的相反顺序调用
34 | * 以声明的相反顺序调用非虚拟基类的析构器
35 | * 以声明的相反顺序调用虚拟基类的析构器
36 |
37 | ### 虚拟基类
38 |
39 | 虚拟基类的析构函数的调用顺序与它们在有向无环图中的出现顺序相反(深度优先、从左到右、后序遍历)。下图描述了继承关系图
40 |
41 | 
42 |
43 | ```
44 | class A
45 | class B
46 | class C : virtual public A, virtual public B
47 | class D : virtual public A, virtual public B
48 | class E : public C, public D, virtual public B
49 | ```
50 |
51 | 首先`C/D`是非虚拟基类调用,非虚拟基类的析构函数的调用顺序与基类名称的声明顺序相反;然后才是虚拟基类的析构器调用。销毁顺序为`E->D->C->B->A`
52 |
53 | ## 显式析构调用
54 |
55 | ```
56 | s.String::~String(); // non-virtual call
57 | ps->String::~String(); // non-virtual call
58 |
59 | s.~String(); // Virtual call
60 | ps->~String(); // Virtual call
61 | ```
62 |
63 | 对未定义析构函数的显式调用没有任何效果
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/class/类、结构体和共同体.md:
--------------------------------------------------------------------------------
1 |
2 | # 类、结构体和共同体
3 |
4 | 类、结构体和共同体是`3`种类的类型,分别通过关键字`class、struct`和`union`定义
5 |
6 | ## 类 vs. 结构体
7 |
8 | 这两个构造在`C++`中是相同的,除了在结构中默认的可访问性是公共的,而在类中默认是私有的
9 |
10 | 类和结构体是用于自定义类型的构造。类和结构体都可以包含数据成员和成员函数,能够描述类型的状态和行为
11 |
12 | ## 访问控制和限制
13 |
14 | 类、结构体和共同体的访问控制(`access control`)和限制(`constraint`)有所差异。如下图所示:
15 |
16 | 
17 |
18 | * 就访问控制而言,结构体和共同体默认访问权限是`public`,而类的访问权限是`private`
19 | * 就访问限制而言,结构体和类没有任何限制,而共同体每次只能使用一个成员
20 |
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/reference/引用概述.md:
--------------------------------------------------------------------------------
1 |
2 | # 引用概述
3 |
4 | 参考:[References (C++)](https://docs.microsoft.com/en-us/cpp/cpp/references-cpp?view=vs-2019)
5 |
6 | ## 引用 vs. 指针
7 |
8 | 引用(`reference`)相对于指针(`pointer`)而言,有如下异同:
9 |
10 | 1. 相似:存储其他对象的内存地址
11 | 2. 不同:初始化后的引用不能引用其他对象或设置为空
12 |
13 | ## lvalue和rvalue
14 |
15 | 引用可分为左值引用(`lvalue`)和右值引用(`rvalue`):
16 |
17 | 1. `lvalue`引用命名变量,用符号`&`表示
18 | 2. `rvalue`引用临时对象,用符号`&&`表示
19 |
20 | ## 语法
21 |
22 | 通用语法如下:
23 |
24 | ```
25 | [storage-class-specifiers] [cv-qualifiers] type-specifiers declarator [= expression];
26 | ```
27 |
28 | 简化语法如下:
29 |
30 | ```
31 | [storage-class-specifiers] [cv-qualifiers] type-specifiers [& or &&] [cv-qualifiers] identifier [= expression];
32 | ```
33 |
34 | 引用声明顺序如下:
35 |
36 | 1. 说明符
37 | * 可选的存储类说明符
38 | * 可选的`cv`限定符
39 | * 类说明符:类名
40 | 2. 声明符
41 | * `&`或者`&&`运算符
42 | * 可选的`cv`限定符
43 | * 标识符
44 | 3. 可选的初始化器
45 |
46 | 引用类型的声明必须包含初始化器,以下情况除外:
47 |
48 | * 显式`extern`声明
49 | * 类成员的声明
50 | * 类内声明
51 | * 函数的参数或函数的返回类型声明
52 |
53 | ## 示例
54 |
55 | 引用对象拥有对象的地址,但其操作和对象一样,可看成是对象的别名
56 |
57 | ```
58 | struct S {
59 | short i;
60 | };
61 |
62 | int main() {
63 | S s; // Declare the object.
64 | S &SRef = s; // Declare the reference.
65 |
66 | cout << (void *) &s << endl;
67 | cout << (void *) &SRef << endl;
68 |
69 | // 已初始化的引用不能引用其他对象
70 | S ss;
71 | SRef = ss;
72 |
73 | cout << (void *) &s << endl;
74 | cout << (void *) &ss << endl;
75 | cout << (void *) &SRef << endl;
76 | }
77 | ```
78 |
79 | 结果:
80 |
81 | ```
82 | 0x7ffc568084d0
83 | 0x7ffc568084d0
84 | 0x7ffc568084d0 // s
85 | 0x7ffc568084e0 // ss
86 | 0x7ffc568084d0 // SRef
87 | ```
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/reference/引用类型函数操作.md:
--------------------------------------------------------------------------------
1 |
2 | # 引用类型函数操作
3 |
4 | 引用可作用于函数参数和函数返回值
5 |
6 | ## 引用类型函数参数
7 |
8 | 参考:[Reference-Type Function Arguments](https://docs.microsoft.com/en-us/cpp/cpp/reference-type-function-arguments?view=vs-2019)
9 |
10 | 将引用作为函数参数,通过传递对象地址的方式进行对象访问,避免对象复制带来的额外开销,通常比直接输入对象更有效
11 |
12 | ### 语法
13 |
14 | 分两种情况,一是函数能够**修改**对象信息,而是函数能够**访问**对象信息
15 |
16 | ```
17 | // 可修改
18 | ret-type func(type& declarator);
19 | // 可访问
20 | ret-type func(const type& declarator);
21 | ```
22 |
23 | ## 引用类型函数返回值
24 |
25 | 参考:[Reference-Type Function Returns](https://docs.microsoft.com/en-us/cpp/cpp/reference-type-function-returns?view=vs-2019)
26 |
27 | 正如通过引用将大对象传递给函数更有效一样,通过引用从函数返回大对象也更有效。引用返回协议消除了在返回之前将对象复制到临时位置的必要性
28 |
29 | 将引用作为函数返回值有以下要求:
30 |
31 | 1. 函数返回类型一定是`lvalue`
32 | 2. 当函数返回时,引用的对象不能超出其作用域范围
33 |
34 | ### 示例
35 |
36 | ```
37 | struct S {
38 | short i;
39 | };
40 |
41 | S &f(S &s) {
42 | // S s;
43 | s.i = 333;
44 |
45 | cout << (void *) &s << endl;
46 |
47 | return s;
48 | }
49 |
50 | int main() {
51 | S a;
52 |
53 | S &s = f(a);
54 |
55 | cout << (void *) &s << endl;
56 | }
57 | ```
58 |
59 | 在`main`函数内将结构体对象`a`输入函数`f`,再返回其引用到`main`函数,赋值给引用对象`s`
60 |
61 | **注意:此时对象`a`的作用域是`main`函数,所以函数返回时没有超出其作用域**
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/reference/指针引用.md:
--------------------------------------------------------------------------------
1 |
2 | # 指针引用
3 |
4 | 参考:[References to pointers](https://docs.microsoft.com/en-us/cpp/cpp/references-to-pointers?view=vs-2019)
5 |
6 | 对指针的引用(`Reference to pointer`)可以用与对对象的引用(`reference to object`)几乎相同的方式声明。指针的引用是一个可修改的值,可以像普通指针一样使用
7 |
8 | ## 示例
9 |
10 | ```
11 | void f(int *&b) {
12 | for (int i = 0; i < 10; i++) {
13 | cout << b[i] << " ";
14 | b[i] = 10 - i;
15 | }
16 | cout << endl;
17 | }
18 |
19 | int main(int argc, char *argv[]) {
20 | int *a;
21 | // 指针引用b和指针a指向同一个地址
22 | int *&b = a;
23 |
24 | b = new int[10];
25 | for (int i = 0; i < 10; i++) {
26 | b[i] = i;
27 | }
28 |
29 | cout << (void *) a << endl;
30 | cout << (void *) b << endl;
31 |
32 | f(b);
33 | for (int i = 0; i < 10; i++) {
34 | cout << a[i] << " ";
35 | }
36 | }
37 | ```
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/smart-pointer/imgs/shared_ptr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZJDoc/VisionGuide/2bf535f664054a93bc830dde736c97d6cab8d5fb/docs/cplusplus/advanced/smart-pointer/imgs/shared_ptr.png
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/smart-pointer/imgs/unique_ptr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZJDoc/VisionGuide/2bf535f664054a93bc830dde736c97d6cab8d5fb/docs/cplusplus/advanced/smart-pointer/imgs/unique_ptr.png
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/smart-pointer/weak_ptr.md:
--------------------------------------------------------------------------------
1 |
2 | # [c++11]weak_ptr
3 |
4 | 参考:[How to: Create and Use weak_ptr Instances](https://docs.microsoft.com/en-us/cpp/cpp/how-to-create-and-use-weak-ptr-instances?view=vs-2019)
5 |
6 | `weak_ptr`是为了避免`shared_ptr`出现循环引用(`cyclic reference`)问题而设计的
7 |
8 | `weak_ptr`实例本身不拥有内存资源,它只能指向`shared_ptr`实例保存的共享资源,所以本身不参与引用计数,因此它不能防止引用计数变为零。使用`weak_ptr`实例时,需要先转换成`shared_ptr`实例,再进行访问;当引用计数为`0`时,内存会被删除,此时调用`weak_ptr`有可能会引发`bad_weak_ptr`异常
9 |
10 | *`weak_ptr`类似于`Java`的弱引用,一方面能够保证避免循环引用问题,另一方面能够保证资源及时销毁,避免内存泄漏*
11 |
12 | ## 成员函数
13 |
14 | * [expired](http://www.cplusplus.com/reference/memory/weak_ptr/expired/):是否`weak_ptr`对象为空或者和它相关的`shared_ptr`对象不存在
15 | * [lock](http://www.cplusplus.com/reference/memory/weak_ptr/lock/):返回一个`shared_ptr`对象,如果`weak_ptr`已经失效(`expired`),返回一个空指针的`shared_ptr`
16 | * [use_count](http://www.cplusplus.com/reference/memory/weak_ptr/use_count/):`weak_ptr`对象所属的`shared_ptr`的引用计数
17 | * [reset](http://www.cplusplus.com/reference/memory/weak_ptr/reset/):设置`weak_ptr`对象为空
18 | * [swap](http://www.cplusplus.com/reference/memory/weak_ptr/swap/):交换两个`weak_ptr`对象的内容,包括所属组
19 |
20 | ## 创建
21 |
22 | ```
23 | template
24 | struct array_deleter {
25 | void operator()(T const *p) {
26 | delete[] p;
27 | }
28 | };
29 |
30 | int main() {
31 | // 创建整型数组
32 | std::shared_ptr ints(new int[10], array_deleter());
33 | for (int i = 0; i < 5; i++) {
34 | ints.get()[i] = i;
35 | }
36 |
37 | // 创建weak_ptr
38 | std::weak_ptr wints(ints);
39 |
40 | cout << wints.use_count() << endl;
41 | cout << wints.expired() << endl;
42 |
43 | auto sptr = wints.lock();
44 | for (int i = 0; i < 5; i++) {
45 | cout << sptr.get()[i] << endl;
46 | }
47 | }
48 | ```
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/smart-pointer/使用原始指针还是智能指针.md:
--------------------------------------------------------------------------------
1 |
2 | # 使用原始指针还是智能指针
3 |
4 | 参考:[C++智能指针的正确使用方式](https://cloud.tencent.com/developer/article/1517336)
5 |
6 | 智能指针能够自动操作内存分配和删除,所以相比较于指针而言,其更能够确保内存和资源不被泄漏
7 |
8 | 不过由于智能指针额外增加了对内存和引用的操作,所以性能上会弱于原始指针操作
9 |
10 | 使用关键在于是否需要关心指针内存:
11 |
12 | * 如果指向已有数组和对象,不需要指针进行内存管理,那么应该使用原始指针
13 | * 对于使用`new`关键字进行显式内存分配的指针而言,因为需要指针自己完成内存新建和删除操作,所以使用智能指针更加安全
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/stl/[shuffle]随机重排列.md:
--------------------------------------------------------------------------------
1 |
2 | # [c++11][stl][shuffle]随机重排列
3 |
4 | 参考:[std::shuffle](http://www.cplusplus.com/reference/algorithm/shuffle/)
5 |
6 | `c++`实现了`shuffle`函数用于随机重新排列指定范围内的元素,使用均匀随机数发生器
7 |
8 | ```
9 | // shuffle algorithm example
10 | #include // std::cout
11 | #include // std::shuffle
12 | #include // std::array
13 | #include // std::default_random_engine
14 | #include // std::chrono::system_clock
15 |
16 | int main() {
17 | std::array foo{1, 2, 3, 4, 5};
18 |
19 | // obtain a time-based seed:
20 | long seed = std::chrono::system_clock::now().time_since_epoch().count();
21 |
22 | shuffle(foo.begin(), foo.end(), std::default_random_engine(seed));
23 |
24 | std::cout << "shuffled elements:";
25 | for (int &x: foo) std::cout << ' ' << x;
26 | std::cout << '\n';
27 |
28 | return 0;
29 | }
30 | ```
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/stl/find.md:
--------------------------------------------------------------------------------
1 |
2 | # [c++11][stl]find
3 |
4 | 参考:[std::find](http://www.cplusplus.com/reference/algorithm/find/)
5 |
6 | `C++`提供了丰富的查询函数
7 |
8 | * `find`
9 | * `find_end`
10 | * `find_first_of`
11 | * `find_if`
12 | * `find_if_not`
13 |
14 | ## find_if
15 |
16 | 参考:[std::find_if](http://www.cplusplus.com/reference/algorithm/find_if/)
17 |
18 | 函数`find_if`发现指定范围内(不包含最后一个位置)是否存在数值符合条件
19 |
20 | 如果存在,返回第一个符合条件的迭代器;如果不存在,返回最后一个值的迭代器
21 |
22 | ```
23 | // find_if example
24 | #include // std::cout
25 | #include // std::find_if
26 | #include // std::vector
27 |
28 | bool IsOdd(int i) {
29 | return ((i % 2) == 1);
30 | }
31 |
32 | int main() {
33 | std::vector myvector;
34 |
35 | myvector.push_back(10);
36 | myvector.push_back(25);
37 | myvector.push_back(40);
38 | myvector.push_back(55);
39 |
40 | std::vector::iterator it = std::find_if(myvector.begin(), myvector.end(), IsOdd);
41 | std::cout << "The first odd value is " << *it << '\n';
42 |
43 | return 0;
44 | }
45 | ```
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/stl/for_each.md:
--------------------------------------------------------------------------------
1 |
2 | # [c++11][stl]for_each
3 |
4 | 参考:[std::for_each](http://www.cplusplus.com/reference/algorithm/for_each/?kw=for_each)
5 |
6 | 使用`for_each`函数对指定范围内的数值逐个进行函数操作
7 |
8 | 最常用的就是遍历操作
9 |
10 | ```
11 | #include // std::cout
12 | #include // std::for_each
13 | #include // std::vector
14 |
15 | void myfunction(int i) { // function:
16 | std::cout << ' ' << i;
17 | }
18 |
19 | struct myclass { // function object type:
20 | void operator()(int i) { std::cout << ' ' << i; }
21 | } myobject;
22 |
23 | int main() {
24 | std::vector myvector;
25 | myvector.emplace_back(10);
26 | myvector.emplace_back(20);
27 | myvector.emplace_back(30);
28 |
29 | std::cout << "myvector contains:";
30 | for_each(myvector.begin(), myvector.end(), myfunction);
31 | std::cout << '\n';
32 |
33 | // or:
34 | std::cout << "myvector contains:";
35 | for_each(myvector.begin(), myvector.end(), myobject);
36 | std::cout << '\n';
37 |
38 | return 0;
39 | }
40 | ```
--------------------------------------------------------------------------------
/docs/cplusplus/advanced/stl/map.md:
--------------------------------------------------------------------------------
1 |
2 | # [c++11][stl]map
3 |
4 | 参考:[std::map](http://www.cplusplus.com/reference/map/map/)
5 |
6 | `map`是存储键/值对的关联容器
7 |
8 | ## 头文件
9 |
10 | ```
11 | #include