侯捷STL課程及源碼剖析學習1

来源:http://www.cnblogs.com/flysong/archive/2017/12/17/8053845.html
-Advertisement-
Play Games

1.C++標準庫和STL C++標準庫以header files形式呈現: (1)C++標準庫的header files不帶尾碼名(.h),例如#include (2)新式C header files 不帶尾碼名.h,例如#include (3)舊式C header files (帶有尾碼名.h)仍... ...


1.C++標準庫和STL

C++標準庫以header files形式呈現:

(1)C++標準庫的header files不帶尾碼名(.h),例如#include <vector>

(2)新式C header files 不帶尾碼名.h,例如#include<cstdio>

(3)舊式C header files (帶有尾碼名.h)仍然可用,例如#include <stdio.h>

(4)新式headers內的組件封裝於namespace “std” 

          using namespace std;或者以 using std::cout;的形式

(5)舊式headers 內的組件不封裝於namespace "std"

在標準庫中,標準模板庫STL(Standard Template Library),占據了標準庫70%,80%以上的內容。

C++ 標準庫的範圍大於STL的範圍。

STL的核心思想是泛型編程(Generic Programming)。

重要資源:

網站:

書籍:

  • The C++ standard Library second edition;
  • STL 源碼剖析

2.STL 六大部件

#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>

using namespace std;

int main()
{
    int ia[6] = { 27, 210, 12, 47, 109, 83 };
        vector<int, allocator<int>> vi(ia, ia + 6);

    cout << count_if(vi.begin(), vi.end(),
        not1(bind2nd(less<int>(), 40)));

    return 0;
}

上述這段代碼用到了STL的六大部件:

allocator 是分配器,vector 是容器,count_if 是演算法

vi.begin() 是迭代器

not1,bind2nd是適配器

less<int> 是仿函數

  • 理解容器的前閉後開的設計。迭代器類似於指針,很多操作和指針差不多++,--運算。vec.begin(),vec.end()指向容器最後一個元素的下一個位置,解引用*(vec.end())錯誤!
  • auto關鍵字的應用

 

3.容器的相關知識

3.1容器的結構與分類

容器按在記憶體中的存儲結構分為三種:順序容器(Sequence Container)、關聯容器(Associative Container)、和無序容器(Unordered Container)。其中的無序容器是C++ 11提出的,實際上無序容器也屬於關聯容器,使用哈希表構成。 

  • Array數組容器,大小固定的
  • Deque:兩段都可以進行插入刪除操作,但是從記憶體上講不通,怎麼實現的要從後面的學習知道。
  • List:是一個雙向的迴圈鏈表,註意是雙向的。
  • Forward-List:單向鏈表,當能用單向鏈表的時候儘量用,可以減少記憶體空間,一個指針在32位pc上占4個位元組,當數據量很多上百萬,不可忽略!
  • Set鍵值都一樣,MultiSet允許元素有重覆。
  • Set/Map用紅黑樹實現,RB-tree是自平衡的二叉樹。
  • Unorder Containers:是C++標準庫里賣的內容。
  • 根據這些圖例,可以知道這些容器在記憶體用到的數據結構是什麼樣的。
  • HashTable實現方法很多,但基本都用Separate Chaining(分離鏈地址法實現)。

3.2順序容器

順序容器:它將單一類型元素聚集起來成為容器,然後根據位置來存儲和訪問這些元素。

標準庫提供了一下幾種順序容器:array、vector、list、forward_list、slist、deque、stack和queue,他們的差別在於訪問元素訪問元素的方式,以及添加或刪除元素相關操作的運行代價。array是C++11的新內容,功能比內置數組更加強大,可以以對象為單位存儲數據,vector支持快速隨機訪問,list支持快速插入/刪除,deque是一個雙端隊列,queue和stack在STL中都是基於deque來實現。

順序容器類型

vector
可變大小數組;
支持快速隨機訪問;
在尾部之外的位置插入或刪除元素可能很慢;        

deque
雙端隊列;
支持快速隨機訪問;
在頭尾位置插入/刪除速度很快;

list
雙向鏈表;
只支持雙向順序訪問;
在list中任何位置進行插入/刪除操作速度都很快;

forward_list
單向鏈表;
只支持單向順序訪問;
在鏈表任何位置進行插入/刪除操作速度都很快;

array
固定大小數組;
支持快速隨機訪問;
不能添加或刪除元素;

string
與vector相似的容器,但專門用於保存字元;
隨機訪問快;
在尾部插入/刪除速度快;

array 測試代碼

#include <array>
#include <iostream>
#include <ctime> 
#include <cstdlib> //qsort, bsearch, NULL

namespace jj01
{
	void test_array()
	{
		cout << "\ntest_array().......... \n";

		array<long, ASIZE> c;

		clock_t timeStart = clock();
		for (long i = 0; i< ASIZE; ++i) {
			c[i] = rand();
		}
		cout << "milli-seconds : " << (clock() - timeStart) << endl;	//
		cout << "array.size()= " << c.size() << endl;
		cout << "array.front()= " << c.front() << endl;
		cout << "array.back()= " << c.back() << endl;
		cout << "array.data()= " << c.data() << endl;

		long target = get_a_target_long();

		timeStart = clock();
		::qsort(c.data(), ASIZE, sizeof(long), compareLongs);
		long* pItem = (long*)::bsearch(&target, (c.data()), ASIZE, sizeof(long), compareLongs);
		cout << "qsort()+bsearch(), milli-seconds : " << (clock() - timeStart) << endl;	//    
		if (pItem != NULL)
			cout << "found, " << *pItem << endl;
		else
			cout << "not found! " << endl;
	}
}

3.3關聯容器

在STL中關聯容器使用紅黑樹來實現,因為不是順序結構,因而不能使用上面提到的push和pop函數,使用insert和erase函數來實現元素的插入刪除操作。

關聯容器支持通過鍵來高效地查找和讀取元素,兩個基本的關聯容器類型是map和set。map的元素以鍵-值(key-value)對的形式組織:鍵用於元素在map中的索引,而值則表示所存儲和讀取的數據。set僅包含一個鍵,並有效地支持關於某個鍵是否存在的查詢。map可理解為字典,set可理解為一類元素的集合。

關聯容器和順序容器的本質差別在於:關聯容器通過鍵(key)存儲和讀取元素,而順序容器則通過元素在容器中的位置順序存儲和訪問元素。

et 和 map 類型的對象所包含的元素都具有不同的鍵,不允許為同一個鍵添加第二個元素。如果一個鍵必須對應多個實例,則需使用 multimap 或 multi set,這兩種類型允許多個元素擁有相同的鍵。

3.4無序容器

嚴格意義上講,無序容器也屬於關聯容器。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 指能夠被內置函數`next`調用並不斷返回下一個值,直到最後拋出`StopIteration`錯誤表示無法繼續返回下一個值的對象稱為迭代器(`Iterator`) ...
  • 1002. 寫出這個數 (20) 讀入一個自然數n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。 輸入格式:每個測試輸入包含1個測試用例,即給出自然數n的值。這裡保證n小於10100。 輸出格式:在一行內輸出n的各位數字之和的每一位,拼音數字間有1空格,但一行中最後一個拼音數字後沒有空格。 輸 ...
  • 你們單位在國外搞了個伺服器,立足於美利堅,受美國法律保護。用來存放你懂的資源,以圖片和電影為主。最近流量非常可觀,為了更好的服務客戶,改善用戶體驗。 你們老闆決定增加一個投票區,用戶可以給自己喜愛的作品投票,每個月評出最喜愛作品,並且從用戶中挑選3名用戶作為獲獎用戶,獎品為蒼老師簽名寫真集。這還不簡 ...
  • 一 python的一些語言規範 再寫腳本的時候我們會寫以上的“註釋行”先來看看它們的意思。 1:調用usr/bin/下的python解釋器去解釋執行你寫的python腳本; 2:系統會自己去找系統中的解釋器去執行; 3:告訴系統編碼方式;(下麵再講其它的編碼方式) 當然,linux系統下預設是安裝了 ...
  • Exchanger,併發工具類,線程協作,用於線程間的數據交換。 ...
  • 1. Python的集合 1.1 集合的定義 在Python中, 集合set是基本數據類型的一種集合類型,它有可變集合(set())和不可變集合(frozenset)兩種。Python中的集合set類似列表,但每個元素都必須時獨一無二的,無序的。 集合set是無序的、不重覆的,是可變的,有add() ...
  • windows下執行 scrapy 的指定的時候出現錯誤, 最初出現錯誤 提示沒有pywin32 那麼就去安裝了一個pywin32 然後pip安裝 https://www.lfd.uci.edu/~gohlke/pythonlibs/#pywin32 但是問題來了,當我安裝完對應版本的pywin32 ...
  • File類總結 File類概述 Java.io.File類 文件和目錄路徑名的抽象表示形式。 把電腦中的文件和文件夾(目錄)封裝成了一個File對象,通過File對象中的方法可以操作文件和文件夾; 是一個與系統無關的類,任意的操作系統都可以使用這個類中的方法操作文件和文件夾 3個File類有關的單詞 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...