0

0

C++ vector二维数组怎么初始化 C++嵌套vector定义与赋值【容器】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-29 14:41:03

|

962人浏览过

|

来源于php中文网

原创

最常用且安全的初始化方式是用构造函数一次性分配外层和内层容量,如vector mat(3, vector(4)); 行列顺序不可颠倒,否则逻辑错误。

c++ vector二维数组怎么初始化 c++嵌套vector定义与赋值【容器】

vector> 声明时直接指定行列尺寸

最常用也最安全的初始化方式是用构造函数一次性分配好外层和内层容量。比如要建一个 3 行 4 列的 int 二维数组:

vector> mat(3, vector(4));

这里 vector(4) 构造出一个含 4 个 0 的一维 vector,再被复制 3 次作为每行。注意:第二个参数是“拷贝构造子对象”,不是类型或大小数字。

  • 如果想初始化为非零值(如 -1),写成 vector> mat(3, vector(4, -1))
  • 不能写成 vector>(3, 4) —— 编译失败,因为第二参数类型不匹配
  • 这种写法在上只做一次内存分配(外层 vector),但每行仍各自在堆上分配,整体仍是动态的

逐行 push_back 或 resize 动态扩展

当行数或列数在运行时才确定,或需要按逻辑逐步填充时,先声明空容器,再用 push_backresize 扩容:

vector> mat;
mat.resize(3); // 外层预留 3 行(每行仍是空 vector)
for (int i = 0; i < 3; ++i) {
    mat[i].resize(4, 7); // 每行设为 4 个元素,初值为 7
}

或者更常见的逐行构造:

立即学习C++免费学习笔记(深入)”;

Zeemo AI
Zeemo AI

一款专业的视频字幕制作和视频处理工具

下载
vector> mat;
for (int i = 0; i < 3; ++i) {
    mat.push_back({1, 2, 3, 4}); // 直接推入 initializer_list
}
  • push_back({1,2,3}) 要求编译器支持 C++11 及以上,且括号内必须是字面量或可隐式转换的列表
  • 避免在循环里反复调用 push_back 单个元素(如 mat[i].push_back(x))—— 效率低,可能多次 realloc
  • 如果已知总大小,优先用第一种构造方式,减少内存碎片

用 vector 初始化 vector:避免浅拷贝陷阱

嵌套 vector 是值语义,赋值或传参时默认深拷贝。但要注意别误用指针或引用导致意外共享:

vector row = {1, 2, 3};
vector> mat(2, row); // OK:两行都是 {1,2,3} 的独立副本
row[0] = 99;
// mat 不受影响

反例(常见错误):

vector> mat;
vector* p = new vector({1,2,3});
mat.push_back(*p); // 看似 OK,但若 p 后续被 delete,mat 里那行仍安全(已拷贝)
// 真正危险的是:mat.push_back(*p); 再 later delete p; —— 没问题;但若写成 mat.push_back(*p), then p->clear(); —— 也不影响 mat
  • 真正容易出错的是把 vector>* 当参数传进函数后,在函数里修改了某一行的引用,结果影响到原始数据 —— 这不是 vector 本身的问题,而是你用了引用/指针却忘了语义
  • 除非明确需要共享数据,否则永远假设 vector 赋值 = 深拷贝;不要试图用 vector>& 来“节省拷贝”然后乱改内容

性能与类型混用:int 和 double 别混在一个 vector> 里

vector 是强类型容器,vector>vector> 完全不同,不能互相赋值或 push_back:

vector> int_mat = {{1,2},{3,4}};
vector> dbl_mat = {{1.0,2.0},{3.0,4.0}};
// int_mat = dbl_mat; // 编译错误
// int_mat.push_back(dbl_mat[0]); // 编译错误
  • 如果需要混合数值类型,要么统一转成 double,要么用 variant, vector>(C++17),但会显著增加复杂度
  • 读文件或解析输入时,务必提前确认数值精度需求;临时用 stoi/stod 转换比让 vector 自动推导更可控
  • 二维 vector 没有内置的“矩阵运算”能力,做乘法、转置等需手写循环或引入 Eigen/Boost

实际写的时候,最容易被忽略的是:构造时行列顺序不能颠倒 —— vector>(rows, vector(cols)) 是 rows 行、cols 列;反过来写就变成“每行只有 1 个元素,共 rows*cols 行”,调试时很难一眼发现。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

544

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

93

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

200

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

93

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

102

2025.10.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

397

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号