C++11中array容器的常見用法

文章目錄

    • 一、概述
    • 二、std::array的特點
    • 三、std::array的定義與初始化
    • 三、std::array的常用成員函數
    • 四、與 C 風格數組的互操作

一、概述

在 C++11 中,std::array 是一個新的容器類型,它提供了一個固定大小的數組封裝。相比傳統的 C 風格數組,std::array 提供了更多的功能和類型安全性,并且更符合現代 C++ 的風格。std::array 是一個模板類,定義在 頭文件中,它封裝了固定大小的數組,并提供了更方便的訪問和操作方法。

二、std::array的特點

  • 固定大小:std::array 的大小在編譯時確定,不能在運行時動態改變。
  • 類型安全:由于 std::array 是模板類,它保證了元素的類型安全,且可以使用類型推斷。
  • 支持標準容器接口:std::array 提供了與其他標準容器類似的接口,如 begin(), end(), size(), empty(), at(), [] 等。
  • 可以與 C 風格數組互操作:std::array 可以通過 data() 方法訪問底層的 C 風格數組。

三、std::array的定義與初始化

std::array 是一個模板類,其模板參數為元素類型和容器大小。
1. 定義與初始化

#include <iostream>
#include <array>int main() {// 定義一個包含 5 個整數的 std::arraystd::array<int, 5> arr = {1, 2, 3, 4, 5};// 訪問元素std::cout << "arr[0] = " << arr[0] << std::endl;// 使用范圍 for 循環打印元素for (const auto& elem : arr) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

2. 使用 fill() 方法初始化
可以使用 fill() 方法為所有元素賦值相同的值:

std::array<int, 5> arr;
arr.fill(10);  // 所有元素被初始化為 10

3. 通過列表初始化
std::array 還可以通過列表初始化進行初始化:

std::array<int, 3> arr = {1, 2, 3};  // 列表初始化

三、std::array的常用成員函數

std::array 提供了很多類似于其他 STL 容器的成員函數,包括獲取容器大小、訪問元素、檢查是否為空等。
1. size():返回數組的大小
std::array 的 size() 函數用于返回數組中元素的數量。與 std::vector 不同,std::array 的大小是固定的(在編譯時已知),所以 size() 返回的是數組的元素總數,而不是動態變化的長度。

#include <iostream>
#include <array>int main() {// 創建一個 std::array,包含 5 個整數元素std::array<int, 5> arr = {1, 2, 3, 4, 5};// 獲取并輸出數組的大小std::cout << "數組的大小: " << arr.size() << std::endl;  // 輸出: 5// 使用 size() 來遍歷數組for (std::size_t i = 0; i < arr.size(); ++i) {std::cout << "arr[" << i << "] = " << arr[i] << std::endl;}return 0;
}

運行結果:
請添加圖片描述
解釋:

  • 在上面的代碼中,arr.size() 返回了 5,表示 std::array<int, 5> 中有 5 個元素。
  • size() 是一個常量時間操作,它的返回值是編譯時已知的常量,因此非常高效。

注意事項:

  • size() 不會返回數組中有效元素的數量。它返回的是數組的固定大小,即使部分元素沒有被賦值,大小依然是固定的;對于 std::array,size() 是編譯時確定的固定值。
  • 對于 std::array<T, N>,size() 始終返回 N,而不會隨著元素的初始化狀態變化;size() 提供了數組的固定大小,返回容器中的元素個數。

通過 size() 使用 std::array:
在許多情況下,你可以使用 size() 來使代碼更加靈活。舉個例子,如果你需要遍歷一個 std::array,使用 size() 可以避免硬編碼數組的長度:

#include <iostream>
#include <array>int main() {std::array<int, 5> arr = {10, 20, 30, 40, 50};// 使用 size() 來遍歷整個數組for (auto& value : arr) {std::cout << value << " ";}std::cout << std::endl;return 0;
}

2. at():返回指定索引的元素,并進行越界檢查

std::array<int, 5> arr = {1, 2, 3, 4, 5};
std::cout << "Element at index 2: " << arr.at(2) << std::endl;  // 輸出 3// 如果索引越界,將拋出 std::out_of_range 異常
try {std::cout << arr.at(10) << std::endl;  // 異常
} catch (const std::out_of_range& e) {std::cout << e.what() << std::endl;  // 輸出異常信息
}

3. operator[]:通過索引訪問元素(沒有越界檢查)

std::array<int, 5> arr = {1, 2, 3, 4, 5};
std::cout << "Element at index 3: " << arr[3] << std::endl;  // 輸出 4

4.begin() 和 end():返回指向數組開始和結束的迭代器

std::array<int, 5> arr = {1, 2, 3, 4, 5};for (auto it = arr.begin(); it != arr.end(); ++it) {std::cout << *it << " ";  // 輸出 1 2 3 4 5
}

5. front() 和 back():返回數組的第一個和最后一個元素

std::array<int, 5> arr = {1, 2, 3, 4, 5};
std::cout << "First element: " << arr.front() << std::endl;  // 輸出 1
std::cout << "Last element: " << arr.back() << std::endl;    // 輸出 5

6. fill():填充整個數組

std::array<int, 5> arr;
arr.fill(42);  // 所有元素都被設置為 42

7. swap():交換兩個 std::array

std::array<int, 3> arr1 = {1, 2, 3};
std::array<int, 3> arr2 = {4, 5, 6};
arr1.swap(arr2);  // 交換 arr1 和 arr2 的內容for (int i : arr1) {std::cout << i << " ";  // 輸出 4 5 6
}

8.empty():表示 std::array 是否為空
empty() 函數返回一個布爾值,表示 std::array 是否為空。如果數組的大小為 0,返回 true,否則返回 false。注意,std::array 在聲明時是一個固定大小的數組,因此它的大小在編譯時就已經確定。即使數組的元素沒有被賦值,empty() 仍然根據數組的大小來判斷是否為空。

#include <iostream>
#include <array>int main() {// 創建一個固定大小的 std::arraystd::array<int, 5> arr = {1, 2, 3, 4, 5};// 使用 empty() 檢查數組是否為空if (arr.empty()) {std::cout << "數組是空的!" << std::endl;} else {std::cout << "數組不為空!" << std::endl;}// 創建一個空數組std::array<int, 0> empty_arr;// 使用 empty() 檢查空數組if (empty_arr.empty()) {std::cout << "空數組是空的!" << std::endl;} else {std::cout << "空數組不為空!" << std::endl;}return 0;
}

運行結果:
請添加圖片描述
說明:

  • 對于 std::array<int, 5>,它的大小是固定的為 5,因此 empty() 會返回 false,即使數組中沒有實際賦值的元素。
  • 對于 std::array<int, 0>,大小為 0,empty() 會返回 true。

總結:

  • empty() 判斷的是數組的大小是否為零,而不是數組中的元素是否已被初始化或賦值。
  • std::array 的大小在編譯時確定,所以它的 empty() 判斷只會在大小為零時返回 true。

四、與 C 風格數組的互操作

std::array 提供了 data() 方法,可以返回底層的 C 風格數組指針,這使得它能夠與傳統的 C 風格數組兼容:

std::array<int, 5> arr = {1, 2, 3, 4, 5};
int* p = arr.data();  // 獲取指向數組的指針// 修改數組元素
p[2] = 100;
for (int val : arr) {std::cout << val << " ";  // 輸出 1 2 100 4 5
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67355.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67355.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67355.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue 響應式渲染 - 待辦事項簡單實現

Vue 漸進式JavaScript 框架 基于Vue2的學習筆記 - Vue 響應式渲染 - 待辦事項簡單實現 目錄 待辦事項簡單實現 頁面初始化 雙向綁定的指令 增加留言列表設置 增加刪除按鈕 最后優化 總結 待辦事項簡單實現 頁面初始化 對頁面進行vue的引入、創建輸入框和按鈕及實例化V…

中文輸入法方案

使用了三年的自然碼雙拼&#xff0c;毫無疑問是推薦使用雙拼輸入法。 三年積累下來的習慣是&#xff1a; 1 自然碼方案 2 空格出字 字母選字 直到如今&#xff0c;想要做出改變&#xff0c;是因為這樣的方案帶來的痛點&#xff1a; 1 使用空格出字就無法使用輔助碼&#…

scrol家族 offset家族 client家族學習

Scroll 系列屬性 scrollTop & scrollLeft scrollTop: 返回元素的內容已向上滾動的部分的高度。scrollLeft: 返回元素的內容已向左滾動的部分的寬度。 scrollHeight & scrollWidth scrollHeight: 返回元素的實際高度&#xff0c;包括由于溢出而在屏幕上不可見的內容…

Python 函數魔法書:基礎、范例、避坑、測驗與項目實戰

Python 函數魔法書&#xff1a;基礎、范例、避坑、測驗與項目實戰 內容簡介 本系列文章是為 Python3 學習者精心設計的一套全面、實用的學習指南&#xff0c;旨在幫助讀者從基礎入門到項目實戰&#xff0c;全面提升編程能力。文章結構由 5 個版塊組成&#xff0c;內容層層遞進…

在Windows系統中本地部署屬于自己的大語言模型(Ollama + open-webui + deepseek-r1)

文章目錄 1 在Windows系統中安裝Ollama&#xff0c;并成功啟動&#xff1b;2 非docker方式安裝open-webui3下載并部署模型deepseek-r1 Ollama Ollama 是一個命令行工具&#xff0c;用于管理和運行機器學習模型。它簡化了模型的下載與部署&#xff0c;支持跨平臺使用&#xff0c…

React中的JavaScript語法

最近在看《深入淺出react和redux》。其實react-redux采用的單相流flux是對傳統mvc的一種改進&#xff0c;而Qt的qml遵循的是傳統mvc&#xff0c;已有類似flux的Qt-qml實現&#xff0c;比如&#xff1a;GitHub - benlau/quickflux: A Flux implementation for QML。為了更好理解…

ProGen生成功能蛋白序列

LLM在包括蛋白質設計等各種生物技術應用中展現出了潛力。ProGen是一種語言模型&#xff0c;它能夠生成在大型蛋白質家族中具有可預測功能的蛋白質序列&#xff0c;這類似于針對不同主題生成語法和語義正確的自然語言句子。該模型在來自超過19,000個家族的2.8億個蛋白質序列上進…

省級數字經濟發展水平數據(2011-2022年)-社科數據

省級數字經濟發展水平數據&#xff08;2011-2022年&#xff09;-社科數據https://download.csdn.net/download/paofuluolijiang/90028602 https://download.csdn.net/download/paofuluolijiang/90028602 數字經濟是指以數據資源為關鍵要素、以現代信息網絡為主要載體、以信息…

Leecode刷題C語言之跳躍游戲②

執行結果:通過 執行用時和內存消耗如下&#xff1a; int jump(int* nums, int numsSize) {int position numsSize - 1;int steps 0;while (position > 0) {for (int i 0; i < position; i) {if (i nums[i] > position) {position i;steps;break;}}}return steps…

《多線程基礎之條件變量》

【條件變量導讀】條件變量是多線程中比較靈活而且容易出錯的線程同步手段&#xff0c;比如&#xff1a;虛假喚醒、為啥條件變量要和互斥鎖結合使用&#xff1f;windows和linux雙平臺下&#xff0c;初始化、等待條件變量的api一樣嗎&#xff1f; 本文將分別為您介紹條件變量在w…

【信息系統項目管理師-選擇真題】2009上半年綜合知識答案和詳解

更多內容請見: 備考信息系統項目管理師-專欄介紹和目錄 文章目錄 【第1題】【第2~3題】【第4題】【第5題】【第6題】【第7題】【第8題】【第9題】【第10題】【第11題】【第12題】【第13題】【第14題】【第15題】【第16題】【第17題】【第18題】【第19題】【第20題】【第21題】…

消息隊列篇--通信協議篇--TCP和UDP(3次握手和4次揮手,與Socket和webSocket的概念區別等)

1、TCP和UDP概述 TCP&#xff08;傳輸控制協議&#xff0c;Transmission Control Protocol&#xff09;和UDP&#xff08;用戶數據報協議&#xff0c;User Datagram Protocol&#xff09;都算是最底層的通信協議&#xff0c;它們位于OSI模型的傳輸層。*傳輸層的主要職責是確保…

mysql_store_result的概念和使用案例

mysql_store_result() 是 MySQL C API 中的一個函數&#xff0c;用于檢索一個完整的結果集到一個客戶端。當執行一個查詢&#xff08;通常是 SELECT 查詢&#xff09;并希望處理所有返回的數據時&#xff0c;可以使用此函數。 概念 mysql_store_result() 函數的原型如下&…

React Router v6配置路由守衛

首先準備好以下頁面 登錄頁&#xff1a;用戶可以在此頁面登錄。 受保護頁&#xff1a;只有登錄的用戶可以訪問&#xff0c;否則會重定向到登錄頁。 公共頁面&#xff1a;不需要鑒權&#xff0c;任何人都可以訪問。 1. 安裝依賴 首先&#xff0c;我們需要安裝 react-router-do…

打破傳統束縛:領略 Web3 獨特魅力

在互聯網發展的歷程中&#xff0c;我們見證了Web1和Web2的變遷。Web1是靜態信息的展示平臺&#xff0c;Web2則引領了社交互動和內容創作的繁榮&#xff0c;而如今&#xff0c;Web3作為新時代的互聯網架構&#xff0c;正逐漸展現出其獨特的魅力&#xff0c;帶領我們走向一個更加…

[論文總結] 深度學習在農業領域應用論文筆記14

當下&#xff0c;深度學習在農業領域的研究熱度持續攀升&#xff0c;相關論文發表量呈現出迅猛增長的態勢。但繁榮背后&#xff0c;質量卻不盡人意。相當一部分論文內容空洞無物&#xff0c;缺乏能夠落地轉化的實際價值&#xff0c;“湊數” 的痕跡十分明顯。在農業信息化領域的…

Linux 學習筆記__Day3

十八、設置虛擬機的靜態IP 1、VMware的三種網絡模式 安裝VMware Workstation Pro之后&#xff0c;會在Windows系統中虛擬出兩個虛擬網卡&#xff0c;如下&#xff1a; VMware提供了三種網絡模式&#xff0c;分別是&#xff1a;橋接模式&#xff08;Bridged&#xff09;、NAT…

QT+mysql+python 效果:

# This Python file uses the following encoding: utf-8 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QMessageBox from PySide6.QtGui import QStandardItemModel, QStandardItem # 導入需要的類# Important: # 你需要通過以下指令把 form.ui轉為ui…

筆記本跑大模型嘗試

1&#xff0c;筆記本電腦資源 我是一臺聯想筆記本電腦&#xff0c;基本配置如下&#xff1a; CPU&#xff1a;12th Gen Intel(R) Core(TM) i7-1255U 1.70 GHz (12核心&#xff0c;2個P核和8個E核&#xff0c;共計10個核心) 顯卡&#xff1a;NVIDIA GeForce MX550 內存&am…

C語言實現掃雷游戲(有展開一片和標記雷的功能)

實現準備 分2個.c源文件和1個.h頭文件去寫代碼 test.c 對掃雷游戲進行測試game.c 掃雷游戲功能的實現game.h 掃雷游戲功能的聲明 掃雷游戲 1.test.c對掃雷游戲進行測試 首先我們要先把玩游戲的框架寫出來&#xff0c;然后一步一步去完成其功能 跟著下面的代碼的節奏走一步一步…