最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中std::distance 和 .size()的區(qū)別小結

 更新時間:2025年07月10日 09:06:51   作者:Ring__Rain  
在C++中,std::distance和.size()雖然都能獲取元素數(shù)量,但二者的設計目的、適用場景和性能特性有顯著差異,下面就來介紹一下兩者的區(qū)別,感興趣的可以了解一下

在 C++ 中,std::distance 和 .size() 雖然都能獲取元素數(shù)量,但二者的設計目的、適用場景和性能特性有顯著差異。以下是關鍵對比及使用建議:

?? ?一、核心區(qū)別?

?特性??**std::distance(first, last)**??**container.size()**?
?使用范圍?任意迭代器范圍(包括子范圍、非容器序列)僅限完整容器(begin() 到 end())
?時間復雜度?隨機訪問迭代器:?O(1)?;非隨機訪問:?O(n)?隨機訪問容器:?O(1)?;部分容器(如 std::list):?O(n)??
?實現(xiàn)原理?根據(jù)迭代器類型動態(tài)選擇(減法或遍歷)容器內(nèi)部計數(shù)器(或遍歷計算)
?靈活性?可計算任意兩個迭代器的距離(如子區(qū)間)僅返回容器總元素數(shù)

?? 示例:計算子范圍長度時只能用 distance

std::vector<int> vec{1, 2, 3, 4, 5};
auto start = vec.begin() + 1; // 指向 2
auto end = vec.end() - 1;    // 指向 5
int len = std::distance(start, end); // 3(正確)
int size = vec.size();               // 5(無法獲取子范圍)

? ?二、性能差異:何時優(yōu)先用.size()???

  1. ?隨機訪問容器(如 std::vector)??

    • ? ?**.size() 更高效?:直接讀取內(nèi)部計數(shù)器,時間復雜度 ?O(1)?**?。
    • ? std::distance(begin(), end()) 雖也是 O(1),但多一次函數(shù)調(diào)用開銷。
  2. ?非隨機訪問容器(如 std::list, std::set)??

    • ?? ?兩者性能可能相同?:
      • std::list::size() 在部分實現(xiàn)中需遍歷鏈表(O(n)),與 std::distance 遍歷代價一致。
      • 例如 GCC 的 std::list::size() 可能調(diào)用 std::distance 實現(xiàn)。
    • ? ?建議用 empty() 替代?:若只需檢查容器是否為空,empty() 是 ?O(1)?? 且更安全。

?? ?三、必須用std::distance的場景?

?計算子范圍長度?

auto mid = vec.begin() + 3;
int sub_len = std::distance(vec.begin(), mid); // 3(前3個元素)[7,10](@ref)

?處理非容器序列(如數(shù)組、自定義迭代器)??

int arr[] = {10, 20, 30};
auto len = std::distance(std::begin(arr), std::end(arr)); // 3[3,9](@ref)

?泛型編程中兼容任意迭代器?
模板代碼需支持各種容器時,distance 可統(tǒng)一處理:

template <typename Iter>
void process(Iter start, Iter end) {
    int n = std::distance(start, end); // 兼容鏈表、向量等[5,8](@ref)
    // ...
}

?四、總結:選擇策略?

?場景??推薦方法??原因?
獲取完整容器元素總數(shù).size()語義清晰,可能更高效(O(1))
檢查容器是否為空.empty()絕對 O(1),避免遍歷
計算子范圍、數(shù)組或泛型迭代器的距離std::distance唯一可行方案,靈活兼容
非隨機訪問容器(如鏈表)的完整范圍長度?**均可,優(yōu)先 .size()**?性能相同,但 .size() 可讀性更佳

?? ?黃金法則?:

  • 優(yōu)先用 .size() 獲取容器總大小;
  • 涉及子范圍、泛型代碼或非容器序列時,必須用 std::distance;
  • 檢查是否為空時,?**永遠用 .empty() 而非 size() == 0**?。

 到此這篇關于C++中std::distance 和 .size()的區(qū)別小結的文章就介紹到這了,更多相關C++ std::distance .size()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • c++ 快速排序算法【過程圖解】

    c++ 快速排序算法【過程圖解】

    下面小編就為大家?guī)硪黄猚++ 快速排序算法【過程圖解】。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • C++ deque/queue/stack的底層原理解析

    C++ deque/queue/stack的底層原理解析

    這篇文章主要介紹了C++ deque/queue/stack的底層原理解析,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 使用C語言求二叉樹結點的最低公共祖先的方法

    使用C語言求二叉樹結點的最低公共祖先的方法

    這篇文章主要介紹了使用C語言求二叉樹結點的最低公共祖先的方法,文中還給出了ACM的練習題目,需要的朋友可以參考下
    2015-08-08
  • C語言中結構體實例解析

    C語言中結構體實例解析

    大家好,本篇文章主要講的是C語言中結構體實例解析,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • 使用dc畫筆畫矩形、直線與橢圓示例

    使用dc畫筆畫矩形、直線與橢圓示例

    這篇文章主要介紹了使用dc畫筆畫矩形、直線與橢圓示例,需要的朋友可以參考下
    2014-04-04
  • C++ 自定義棧實現(xiàn)迷宮求解

    C++ 自定義棧實現(xiàn)迷宮求解

    這篇文章主要介紹了C++ 自定義棧實現(xiàn)迷宮求解的相關資料,需要的朋友可以參考下
    2017-07-07
  • C++結構體與類指針知識點總結

    C++結構體與類指針知識點總結

    在本篇文章里小編給大家整理了關于C++結構體與類指針知識點以及相關內(nèi)容,有興趣的朋友們參考學習下。
    2019-09-09
  • c語言獲取文件大小的示例

    c語言獲取文件大小的示例

    在C語言中測試文件的大小,主要使用二個標準函數(shù),下面是使用示例,需要的朋友可以參考下
    2014-02-02
  • C語言中free函數(shù)的使用詳解

    C語言中free函數(shù)的使用詳解

    free函數(shù)是釋放之前某一次malloc函數(shù)申請的空間,而且只是釋放空間,并不改變指針的值。下面我們就來詳細探討下
    2017-05-05
  • C/C++整數(shù)乘積的溢出問題的解決

    C/C++整數(shù)乘積的溢出問題的解決

    整數(shù)乘積的溢出問題是指兩個整數(shù)相乘得到的結果超過了所能表示的數(shù)據(jù)類型的范圍,本文給大家介紹了C/C++整數(shù)乘積的溢出問題的解決,需要的朋友可以參考下
    2024-02-02

最新評論

宁海县| 衡阳市| 若羌县| 眉山市| 昆山市| 黑龙江省| 台州市| 土默特右旗| 肥乡县| 石狮市| 灵台县| 葵青区| 噶尔县| 新安县| 班玛县| 甘洛县| 浙江省| 武山县| 江口县| 唐山市| 海阳市| 修文县| 乐亭县| 乐安县| 和政县| 嘉定区| 白城市| 资溪县| 贞丰县| 重庆市| 朔州市| 金寨县| 武穴市| 哈尔滨市| 湘潭市| 南召县| 宁远县| 武鸣县| 哈巴河县| 江都市| 虹口区|