C++笔记之初始化二维矩阵的方法

C++笔记之初始化二维矩阵的方法

—— 2023年5月20日 上海


code review!
在这里插入图片描述

文章目录

  • C++笔记之初始化二维矩阵的方法
    • 一.常见方法
      • 1. 使用数组
      • 2. 使用向量
      • 3. 使用数组的动态分配
      • 4. 使用嵌套的 std::vector 并使用resize方法
      • 5. 初始化固定大小的 std::array
    • 二.C++中使用vector初始化二维矩阵的所有方法
      • 1. 列表初始化
      • 2. 使用 `resize` 方法——重要:
      • 3. 使用 `push_back` 方法:
      • 4. 使用 `emplace_back` 方法:
      • 5. 使用 `assign` 方法——重要:
      • 6. 使用 `insert` 方法:
    • 三.根据一个已有的二维矩阵使用std::vector来初始化一个新的二维矩阵
      • 1. 使用拷贝构造函数——重要
      • 2. 使用赋值运算符——重要
      • 3. 使用 `assign` 方法
      • 4. 使用 `std::copy` 函数
      • 5. 使用 `std::copy_n` 函数
      • 6. 使用范围基础的 for 循环和 `push_back` 方法
    • 三.根据一个已有的二维矩阵使用std::vector来初始化一个新的同维度的,所有元素都为0的二维矩阵
      • 1. 使用 `resize` 方法和循环——重要
      • 2. 使用 `resize` 方法和 `std::transform` 函数
      • 3. 使用嵌套的 `resize` 方法

一.常见方法

1. 使用数组

你可以使用二维数组来初始化一个矩阵:

int matrix[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };

2. 使用向量

你也可以使用std::vector来创建和初始化二维矩阵:

std::vector<std::vector<int>> matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };

3. 使用数组的动态分配

如果你需要动态地创建矩阵(例如,其尺寸在运行时确定),可以使用new操作符:

int rows = 3;
int cols = 3;
int** matrix = new int*[rows];
for(int i = 0; i < rows; ++i)
    matrix[i] = new int[cols];

然后你可以使用循环来初始化这个矩阵。

4. 使用嵌套的 std::vector 并使用resize方法

如果你需要动态地创建和初始化矩阵,但你更喜欢使用std::vector,你可以这样做:

int rows = 3;
int cols = 3;
std::vector<std::vector<int>> matrix;
matrix.resize(rows, std::vector<int>(cols, 0)); // 这将创建一个3x3的矩阵,并用0填充

5. 初始化固定大小的 std::array

对于固定大小的二维矩阵,可以使用std::array

std::array<std::array<int, 3>, 3> matrix = { { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} } };

在这里插入图片描述

二.C++中使用vector初始化二维矩阵的所有方法

在 C++ 中,使用 std::vector 来初始化二维矩阵是常见的做法,因为它提供了灵活的大小和方便的内存管理。以下是一些方法:

1. 列表初始化

你可以在声明时就初始化 std::vector

std::vector<std::vector<int>> matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };

2. 使用 resize 方法——重要:

如果你已经知道矩阵的大小,但要稍后填充值,可以使用 resize 方法:

std::vector<std::vector<int>> matrix;
matrix.resize(rows, std::vector<int>(cols));

3. 使用 push_back 方法:

你也可以创建一个空的 std::vector,然后使用 push_back 方法来添加行:

std::vector<std::vector<int>> matrix;
for(int i = 0; i < rows; ++i) {
    std::vector<int> row;
    for(int j = 0; j < cols; ++j) {
        row.push_back(value);
    }
    matrix.push_back(row);
}

4. 使用 emplace_back 方法:

类似于 push_back,但 emplace_back 直接在原地构造新元素,通常效率更高:

std::vector<std::vector<int>> matrix;
for(int i = 0; i < rows; ++i) {
    matrix.emplace_back(std::vector<int>(cols, value));
}

5. 使用 assign 方法——重要:

assign 方法可以用来替换 std::vector 中的所有元素:

std::vector<std::vector<int>> matrix;
matrix.assign(rows, std::vector<int>(cols, value));

6. 使用 insert 方法:

insert 方法可以在 std::vector 的任何位置插入新元素:

std::vector<std::vector<int>> matrix;
for(int i = 0; i < rows; ++i) {
    matrix.insert(matrix.end(), std::vector<int>(cols, value));
}

注意,在这些例子中,rowscolsvalue 都是整数变量,分别表示矩阵的行数、列数和初始值。

三.根据一个已有的二维矩阵使用std::vector来初始化一个新的二维矩阵

在C++中,如果你已经有一个二维矩阵,你可以通过多种方式使用std::vector来初始化一个新的二维矩阵:

1. 使用拷贝构造函数——重要

std::vector<std::vector<int>> old_matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
std::vector<std::vector<int>> new_matrix(old_matrix);

2. 使用赋值运算符——重要

std::vector<std::vector<int>> old_matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
std::vector<std::vector<int>> new_matrix = old_matrix;

3. 使用 assign 方法

std::vector<std::vector<int>> old_matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
std::vector<std::vector<int>> new_matrix;
new_matrix.assign(old_matrix.begin(), old_matrix.end());

4. 使用 std::copy 函数

std::vector<std::vector<int>> old_matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
std::vector<std::vector<int>> new_matrix(old_matrix.size());
std::copy(old_matrix.begin(), old_matrix.end(), new_matrix.begin());

5. 使用 std::copy_n 函数

std::vector<std::vector<int>> old_matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
std::vector<std::vector<int>> new_matrix(old_matrix.size());
std::copy_n(old_matrix.begin(), old_matrix.size(), new_matrix.begin());

6. 使用范围基础的 for 循环和 push_back 方法

std::vector<std::vector<int>> old_matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
std::vector<std::vector<int>> new_matrix;
for (const auto &row : old_matrix) {
    new_matrix.push_back(row);
}

以上就是使用 std::vector 根据已有的二维矩阵初始化新的二维矩阵的一些方法。根据你的具体需求和优化考虑,你可能需要选择不同的方法。

三.根据一个已有的二维矩阵使用std::vector来初始化一个新的同维度的,所有元素都为0的二维矩阵

在C++中,如果你已经有一个二维矩阵,并希望创建一个新的、同维度的、所有元素都为0的二维矩阵,以下是一些方法:

1. 使用 resize 方法和循环——重要

std::vector<std::vector<int>> old_matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
std::vector<std::vector<int>> new_matrix;
for(const auto &row : old_matrix) {
    new_matrix.push_back(std::vector<int>(row.size(), 0));
}

2. 使用 resize 方法和 std::transform 函数

std::vector<std::vector<int>> old_matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
std::vector<std::vector<int>> new_matrix(old_matrix.size());
std::transform(old_matrix.begin(), old_matrix.end(), new_matrix.begin(), [](const std::vector<int>& row) {
    return std::vector<int>(row.size(), 0);
});

3. 使用嵌套的 resize 方法

std::vector<std::vector<int>> old_matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
std::vector<std::vector<int>> new_matrix;
new_matrix.resize(old_matrix.size());
for(size_t i = 0; i < old_matrix.size(); ++i) {
    new_matrix[i].resize(old_matrix[i].size(), 0);
}

在以上的所有例子中,old_matrix 是你已有的二维矩阵,new_matrix 是新创建的二维矩阵。所有的新矩阵元素都被初始化为0,并且新矩阵的尺寸与原矩阵相同。

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

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

相关文章

CSS3属性详解(一)文本 盒模型中的 box-ssize 属性 处理兼容性问题:私有前缀 边框 背景属性 渐变 前端开发入门笔记(七)

CSS3是用于为HTML文档添加样式和布局的最新版本的层叠样式表&#xff08;Cascading Style Sheets&#xff09;。下面是一些常用的CSS3属性及其详细解释&#xff1a; border-radius&#xff1a;设置元素的边框圆角的半径。可以使用四个值设置四个不同的圆角半径&#xff0c;也可…

基于Java的新闻发布管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

华为云HECS云服务器docker环境下安装nacos

华为云HECS云服务器&#xff0c;安装docker环境&#xff0c;查看如下文章。 华为云HECS安装docker-CSDN博客 一、拉取镜像 docker pull nacos/nacos-server二、宿主机创建挂载目录 执行如下命令&#xff1a; mkdir -p /usr/local/nacos/logs mkdir -p /usr/local/nacos/con…

基于指数分布优化的BP神经网络(分类应用) - 附代码

基于指数分布优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于指数分布优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.指数分布优化BP神经网络3.1 BP神经网络参数设置3.2 指数分布算法应用 4.测试结果…

模型保存和加载

1、sklearn模型的保存和加载API from sklearn.externals import joblib 保存&#xff1a;joblib.dump(rf, ‘test.pkl’)加载&#xff1a;estimator joblib.load(‘test.pkl’) 2、决策树的模型保存加载案例 保存&#xff1a; import joblib from sklearn.model_selectio…

OpenCV #以图搜图:感知哈希算法(Perceptual hash algorithm)的原理与实验

1. 介绍 感知哈希算法&#xff08;Perceptual Hash Algorithm&#xff0c;简称pHash&#xff09; 是哈希算法的一种&#xff0c;主要用来做相似图片的搜索工作。 2. 原理 感知哈希算法&#xff08;pHash&#xff09;首先将原图像缩小成一个固定大小的像素图像&#xff0c;然后…

【模式识别】贝叶斯决策模型理论总结

贝叶斯决策模型理论 一、引言二、贝叶斯定理三、先验概率和后验概率3.1 先验概率3.2 后验概率 四、最大后验准则五、最小错误率六、最小化风险七、最小最大决策八、贝叶斯决策建模参考 一、引言 在概率计算中&#xff0c;我们常常遇到这样的一类问题&#xff0c;某事件的发生可…

MobileNetV3

相对重量级网络而言&#xff0c;轻量级网络的特点是参数少、计算量小、推理时间短。更适用于存储空间和功耗受限的场景&#xff0c;例如移动端嵌入式设备等边缘计算设备。因此轻量级网络受到了广泛的关注&#xff0c;其中MobileNet可谓是其中的佼佼者。MobileNetV3经过了V1和V2…

iOS 配置通用链接(Universal Link)服务端和开发者后台都配置好了,还是跳转不到App

目录 一、什么是 Universal Link&#xff1f; 1.背景介绍 2.特点 3.运行机制原理&流程图 二、配置教程 1.第一步&#xff1a;开启 Associated Domains 服务 1.1 开通 Associated Domains 2.第二步&#xff1a;服务器配置 apple-app-site-association&#xff08;AAS…

RISC-V架构——中断处理和中断控制器介绍

1、ARM架构中断机制介绍 本文不是从零开始讲解中断&#xff0c;对于中断的基本知识不再赘述&#xff0c;对中断不是很了解可以先学习ARM中断的文章。参考博客&#xff1a;《ARM架构的外部中断介绍(S5PV210芯片)》&#xff1b; 2、RIAC_V架构的中断控制器架构 &#xff08;1&…

Qt之自定义事件QEvent

在Qt中,自定义事件的步骤大概如下: 1.创建自定义事件,自定义事件需要继承QEvent 2.使用QEvent::registerEventType()注册自定义事件类型,事件的类型需要在 QEvent::User 和 QEvent::MaxUser 范围之间,在QEvent::User之前是预留给系统的事件 3.使用sendEvent() 和 postEv…

【软件安装】Linux系统中安装MySQL数据库服务

这篇文章&#xff0c;主要介绍如何在Linux系统中安装MySQL数据库服务。 目录 一、Linux安装MySQL 1.1、下载MySQL安装包 1.2、解压MySQL安装包 1.3、更改存放目录 1.4、创建用户组和用户 1.5、创建数据目录data 1.6、创建my.cnf配置文件 1.7、初始化数据库 1.8、添加m…

C# 基于腾讯云人脸核身和百度云证件识别技术相结合的 API 实现

目录 腾讯云人脸核身技术 Craneoffice.net 采用的识别方式 1、活体人脸核身(权威库)&#xff1a; 2、活体人脸比对&#xff1a; 3、照片人脸核身(权威库)&#xff1a; 调用成本 百度云身份证识别 调用成本 相关结合点 核心代码 实现调用人脸核身API的示例 实现调用身…

微信小程序设置 wx.showModal 提示框中 确定和取消按钮的颜色

wx官方提供的 showModal 无疑是个非常优秀的选择提示工具 但是 我们还可以让他的颜色更贴近整体的小程序风格 cancelColor 可以改变取消按钮的颜色 confirmColor 则可以控制确定按钮的颜色 参考代码如下 wx.showModal({cancelColor: #0000FF,confirmColor: #45B250,content:…

行业追踪,2023-10-25

自动复盘 2023-10-25 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

如何构建一个外卖微信小程序

随着外卖行业的不断发展&#xff0c;越来越多的商家开始关注外卖微信小程序的开发。微信小程序具有使用方便、快速上线、用户覆盖广等优势&#xff0c;成为了商家们的首选。 那么&#xff0c;如何快速开发一个外卖微信小程序呢&#xff1f;下面就让我们来看看吧&#xff01; 首…

Python Opencv实践 - 入门使用Tesseract识别图片中的文字

做车牌识别项目前试一试tesseract识别中文。tesseract的安装使用请参考&#xff1a; Python OCR工具pytesseract详解 - 知乎pytesseract是基于Python的OCR工具&#xff0c; 底层使用的是Google的Tesseract-OCR 引擎&#xff0c;支持识别图片中的文字&#xff0c;支持jpeg, png…

面试题之Vue和React的区别是什么?

一提到前端框架&#xff0c;相信大家都对Vue和React不陌生&#xff0c;这两个前端框架都是比较主流的&#xff0c;用户也都比较多&#xff0c;但是我们在使用这些框架的时候&#xff0c;是否对这两个框架之间的区别有所了解呢&#xff1f;接下来&#xff0c;让我们来一起的系统…

RK3399平台开发中安卓系统去除USB权限弹窗

RK3399平台开发中安卓系统去除USB权限弹窗 问题方法 问题 当我们在访问一个插入到Android系统的USB设备的时候往往是需要权限的&#xff0c;此时系统会弹出询问权限的对话框&#xff0c;而我们此时希望让它默认允许访问USB设备并且不希望用户看到这个对话框。 方法 文件目录&…

Git不常用命令(持续更新)

今日鸡汤&#xff1a;当你最满足的时候&#xff0c;通常也最孤独&#xff1b;当你最愤慨的时候&#xff0c;通常也最可怜。 此博文会列出一些平时不常用&#xff0c;但是能提高效率的git命令&#xff0c;后续会出IDEA对应的操作步骤 快看看你是不是都用过... 分支&#xff08;…