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/zh-tw/n/335009.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
DDEWE的頭像DDEWE
上一篇 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

發表回復

登錄後才能評論