c++ 二维vector的初始化

一、vector概述

vector 是 c++ 标准库中的一个动态数组容器,可以动态的增删元素。vector 内部维护着一块连续的内存,动态增加或者删去元素时,vector会重新分配一块连续的内存空间,将数据拷贝到新的内存中,并且释放旧内存。vector 就像一个可以改变大小的数组,它可以存储任意的数据类型,而且支持随机访问。在使用 vector 时,需要注意避免大量的插入或删除元素的操作,因为它会频繁的进行内存分配和释放,造成性能上的浪费。

二、一维vector的初始化

在介绍二维vector的初始化之前,先来看一下常见的一维vector的初始化方式。

#include <vector>
using namespace std;

int main(){
  // 1. 初始化为指定大小,初始值为默认值 0
  vector<int> v1(5);
  // {0, 0, 0, 0, 0}

  // 2. 初始化为指定大小,初始值为指定值
  vector<int> v2(5, 1);
  // {1, 1, 1, 1, 1}

  // 3. 初始化为指定数组的区间
  int a[] = {1, 2, 3, 4, 5};
  vector<int> v3(a, a + 5); // v3.size() == 5,v3包含数组a中的5个元素
  // {1, 2, 3, 4, 5}

  // 4. 初始化为另一个vector的区间
  vector<int> v4(v2.begin(), v2.begin() + 3);
  // {1, 1, 1}

  return 0;
}

三、二维vector的初始化

1. 初始化为指定大小

二维vector初始化为指定大小时,需要指定行数和列数,语法为:vector<vector<类型>> vec(行数, vector<类型>(列数, 初始值))。

#include <vector>
using namespace std;

int main(){
  // 1. 初始化为指定大小,初始值为默认值 0
  vector<vector<int>> vec1(3, vector<int>(4));
  // {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}

  // 2. 初始化为指定大小,初始值为指定值
  vector<vector<int>> vec2(3, vector<int>(4, 1));
  // {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}}

  return 0;
}

2. 初始化为指定值

二维vector初始化为指定值时,需要指定所需行数和列数,但指定的初始值是相同的。语法为:vector<vector<类型>> vec(行数, vector<类型>(列数, 初始值))。

#include <vector>
using namespace std;

int main(){
  // 1. 初始化为指定值
  vector<vector<int>> vec1(3, vector<int>(4, 1));
  // {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}}

  return 0;
}

3. 不预先分配大小

可以在需要时进行分配,先初始化行数,再给每一行初始化列数。需要注意,分配空间之后,可以通过下标直接赋值,但如果需要添加新的行或者列,需要通过 push_back() 函数添加。

#include <vector>
#include <iostream>
using namespace std;

int row, col;
vector<vector<int>> vec;

int main(){
  // 1. 不预先分配大小
  cin >> row >> col;
  vec.resize(row); // 初始化行数
  for(int i = 0; i < row; i++){
    vec[i].resize(col); // 给每一行初始化列数
    for(int j = 0; j < col; j++){
      cin >> vec[i][j]; // 通过下标直接赋值
    }
  }

  // 2. 进行输出以验证
  for(int i = 0; i < row; i++){
    for(int j = 0; j < col; j++){
      cout << vec[i][j] << " ";
    }
    cout << endl;
  }

  return 0;
}

四、动态二维vector操作

如果要在二维vector中动态添加或删除行或列,则需要使用 push_back() 或者 erase() 函数进行操作。

1. 添加行

使用 push_back() 函数可以添加新的行,语法为:vector.push_back(vector<类型>(列数, 初始值))。

#include <vector>
#include <iostream>
using namespace std;

int main(){
  vector<vector<int>> vec(2, vector<int>(3, 1));
  // {{1, 1, 1}, {1, 1, 1}}

  // 添加一行
  vec.push_back(vector<int>(3, 2));
  // {{1, 1, 1}, {1, 1, 1}, {2, 2, 2}}

  return 0;
}

2. 删除行

使用 erase() 函数可以删除行,语法为:vector.erase(ite)。

#include <vector>
#include <iostream>
using namespace std;

int main(){
  vector<vector<int>> vec(3, vector<int>(3, 1));
  // {{1, 1, 1}, {1, 1, 1}, {1, 1, 1}}

  // 删除第二行,需要注意,删除操作会使被删元素所占用的内存被释放
  vec.erase(vec.begin() + 1);
  // {{1, 1, 1}, {1, 1, 1}}

  return 0;
}

3. 添加列

添加新的列需要分别对每一行进行操作,使用 push_back() 函数添加新元素。

#include <vector>
#include <iostream>
using namespace std;

int main(){
  vector<vector<int>> vec(2, vector<int>(2, 1));
  // {{1, 1}, {1, 1}}

  // 添加一列
  for(int i = 0; i < vec.size(); i++){
    vec[i].push_back(2);
  }
  // {{1, 1, 2}, {1, 1, 2}}

  return 0;
}

4. 删除列

删除列同样需要分别对每一行进行操作,使用 erase() 函数删除元素。

#include <vector>
#include <iostream>
using namespace std;

int main(){
  vector<vector<int>> vec(2, vector<int>(3, 1));
  // {{1, 1, 1}, {1, 1, 1}}

  // 删除第二列
  for(int i = 0; i < vec.size(); i++){
    vec[i].erase(vec[i].begin() + 1);
  }
  // {{1, 1}, {1, 1}}

  return 0;
}

总结

使用 vector 作为二维数组来存储数据,可以在代码实现中动态分配和释放内存,非常灵活。但是,如果频繁的进行添加或删除元素的操作,会严重影响程序的运行效率。为了提高程序的效率,在使用二维vector时,需要根据实际情况选择合适的初始化方式,尽可能的减少对数组大小的改动,从而降低内存管理的成本,提高程序的性能。

原创文章,作者:DDEWE,如若转载,请注明出处:https://www.506064.com/n/335009.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
DDEWEDDEWE
上一篇 2025-02-05 13:05
下一篇 2025-02-05 13:05

相关推荐

  • Go中struct的初始化

    本文将从多个方面详细阐述Go中struct的初始化方式,包括使用字面量初始化、使用new函数初始化以及使用构造函数等。通过本文的介绍,读者能够更深入的了解Go中struct的初始化…

    编程 2025-04-28
  • Java的vector用法详解

    一、vector的用法 java中的vector是可变长度的动态数组,类似于c++中的vector。可以存储任何数据类型,但需要保证类型一致。下面是一个vector的使用示例: i…

    编程 2025-04-25
  • c++ vector头文件详解

    一、vector介绍 vector是c++ STL(Standard Template Library)中的一个容器,它能够动态地增加或减少容器的大小,并且支持快速的随机访问。ve…

    编程 2025-04-24
  • C# Dictionary初始化的详解

    一、基础认识 C#中的Dictionary是一种键值对存储的数据类型,可以根据键(Key)访问对应的值(Value),它是.NET Framework中的常用类之一。创建Dicti…

    编程 2025-04-23
  • JS初始化详解

    JavaScript是一门动态的、基于事件驱动的编程语言,可以使网页在用户交互时产生动态特效和更好的交互性。JS的初始化是网页中必不可少的一环,好的初始化可以提高网页的加载速度和用…

    编程 2025-04-23
  • vector初始化赋值详解

    一、基础概念 vector是一个封装了动态大小数组的顺序容器(Sequence Container)。与C-style数组不同,它能够根据需要自动扩展,它是连续存储的,与数组一样高…

    编程 2025-04-22
  • 深入探析vector添加元素

    一、初始化vector 1、动态初始化vector 使用vector时,我们需要先将其初始化,vector可以有多种初始化方式。其中动态初始化是指我们需要在程序运行时才能确定vec…

    编程 2025-04-12
  • Kotlinlateinit:深入理解 Kotlin 的延迟初始化属性

    Kotlinlateinit 是 Kotlin 延迟初始化属性的一个重要概念。在一些情况下,Kotlin 允许我们在声明属性时使用 lateinit 关键字,来将属性的初始化推迟到…

    编程 2025-04-12
  • 详解vector的reserve函数

    一、概述 在C++的STL中,vector是一种很常用的容器,它可以存放任意类型的数据,并且可以动态增加或减少元素个数。其中,reserve函数是vector的一个重要函数,它可以…

    编程 2025-04-12
  • C++ Vector初始化

    一、定义和构造函数 C++中的vector是一个类模板,它是一种动态数组,支持在数组的尾部增加或删除元素。在使用vector进行初始化时,有两种常见的方法。 第一种是使用定义和构造…

    编程 2025-04-12

发表回复

登录后才能评论