C++STL學習

1. STL介紹
標準模板庫STL是當今每個從事C++編程的人需要掌握的技術,所有很有必要總結下
本文將介紹STL并探討它的三個主要概念:容器、迭代器、算法。
STL的最大特點就是:
數據結構和算法的分離,非面向對象本質。訪問對象是通過象指針一樣的迭代器實現的;
容器是象鏈表,矢量之類的數據結構,并按模板方式提供;
算法是函數模板,用于操作容器中的數據。由于STL以模板為基礎,所以能用于任何數據類型和結構。
容器可以分為三種主要類型:序列容器、關聯容器、容器適配器。
每種STL容器都具有相關聯的成員函數,這些成員函數的一個子集在所有的STL容器中都定義了。
STL迭代器的屬性和指針類似,程序可以利用迭代器操作STL容器中的元素
STL算法是用于執行常見數據操作的函數,這些操作包括搜索、排序和比較元素,STL提供了大約70種算法,其中大多數算法都使用迭代器來訪問容器元素。
1.1 ? 容器簡介
?容器可以分為三種:序列容器、關聯容器、容器適配器。
序列容器:vector deque list
Vector:可從后端執行快速的插入和刪除,直接訪問任何元素
Deque:從前面或后面執行快速的插入和刪除,直接訪問任何元素
List:雙鏈表,能在任何地方執行快速的插入和刪除
關聯容器:set multiset map multimap
Set:執行快速搜索,元素不允許重復
Multiset:執行快速搜索,元素允許重復
Map:一對一映射,元素不允許重復,快速的基于鍵的搜索
Multimap:一對多映射,元素允許重復,快速的基于鍵的搜索
容器適配器:stack queue priority_queue
Stack:后進先出
Queue:先進先出
priority_queue:優先級最高的元素總是最先出隊
序列容器表示線性數據結構,例如向量和鏈表;
關聯容器是非線性容器,通常能夠快速找出保存在容器中的元素。這類容器能夠保存值的集合或鍵/值對;序列容器和關聯容器統稱為第一類容器。
STL將堆棧和隊列實現為容器適配器,使程序以一種受約束的方式看待序列容器。
STL通常可通過模板實現泛型編程,以避免繼承和虛函數,獲得更好的執行時性能。
1.2 ? 迭代器簡介
迭代器在許多方面和指針相同,用于指向第一類容器的元素。
迭代器提供對一個容器中的對象的訪問方法,并且定義了容器中對象的范圍。迭代器就如同一個指針。事實上,C++的指針也是一種迭代器。但是,迭代器不僅僅是指針,因此你不能認為他們一定具有地址值。例如,一個數組索引,也可以認為是一種迭代器。
迭代器有各種不同的創建方法。程序可能把迭代器作為一個變量創建。一個STL容器類可能為了使用一個特定類型的數據而創建一個迭代器。作為指針,必須能夠使用*操作符類獲取數據。你還可以使用其他數學操作符如++。典型的,++操作符用來遞增迭代器,以訪問容器中的下一個對象。如果迭代器到達了容器中的最后一個元素的后面,則迭代器變成past-the-end值。使用一個past-the-end值得指針來訪問對象是非法的,就好像使用NULL或為初始化的指針一樣。
廢話不多說,直接上demo
//利用istream_iterator進行輸入,利用ostream_iterator進行輸出 ?
//下面程序演示了使用istream_iterator從標準輸入進行輸入,以及使用ostream_iterator輸出到標準輸出 ?
#include "stdafx.h" ?
#include <iostream> ?
using namespace std; ?
??
#include <iterator> ?
??
int _tmain(int argc, _TCHAR* argv[]) ?
{ ?
?cout<<"輸入2個整數:"<<endl; ?
?//下行創建了一個istream_iterator,它能夠以一種類型安全的方式從標準輸入對象cin提取int值 ?
?std::istream_iterator<int> inputInt(cin); ?
??
?//下行對迭代器inputInt解除引用,并從cin中讀出一個整數,然后將它賦予number1 ?
?int number1=*inputInt; ?
?++inputInt; ? ? ? ? ? ? ? ? ? ?//將迭代器inputInt定位到輸出流中的下一個值 ?
?int number2=*inputInt; ? ? ? ? //從inputInt輸入下一個整數,并將它賦予number2 ?
??
?//下行創建了一個ostream_iterator,它能夠在標準輸出對象cout中出入int值 ?
?std::ostream_iterator<int> outputInt(cout); ?
?cout<<"和是:"<<endl; ?
?*outputInt=number1+number2; //將number1和number2的和賦予*outputInt ?
?cout<<endl; ?
?system("pause"); ?
?return 0; ?
} ?


?
?
1.3 ? 算法簡介
STL算法能用于各種容器。STL提供的許多算法,大量用于操作容器,插入、刪除、搜索、排序以及其他算法,都適合于部分或者所有的STL容器。
STL的實現非常簡單。到目前為止,類的設計者都將算法作為容器的成員函數,使算法和容器相關聯。STL采用不同的方法,STL的算法和容器是分離的,它只是間接地通過迭代器操作容器的元素。
STL算法能夠用于STL容器以及基于指針的、C風格的數組

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

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

相關文章

Linux系統編程--2(環境變量,進程控制)

環境變量 環境變量 是指在操作系統中用來指定操作系統運行環境的一些參數 每個人用電腦的習慣不一樣&#xff0c;比如一般把文件放到磁盤&#xff0c;怎么管理文件&#xff0c;用什么編譯器&#xff0c;所以&#xff0c;環境變量就是根據每個人使用操作系統的習慣來規定一些參…

STL-vector

STL學習之二 序列容器&#xff08;vector&#xff09;一、C標準模板庫提供了三種序列容器&#xff1a;vector、list、deque。類模板vector和deque都以數組為基礎&#xff0c;類模板list實現了鏈表的數據結構。STL中最流行的是類模板vector&#xff0c;它是一種更健壯的數據類型…

套接字編程--1(UDP協議編程,端口號,傳輸層協議,網絡字節序)

傳輸層的協議&#xff1a; ip地址&#xff1a; 在網絡中唯一標識一臺主機 IPV4&#xff1a;uint32_t DHCP NATIPV6 : uint8_t addr[16] —向前并不兼容IPV4 每一條數據都必須包含源地址和目的地址&#xff1a;因為每條網絡中的數據都必須確定是從那個主機來到那個主機去 端…

ARP簡單介紹

ARP簡介 ARP&#xff08;Address Resolution Protocol&#xff09;用于將IP地址解析為MAC地址 1. ARP地址解析的必要性 IP地址不能直接用來進行通信&#xff0c;因為網絡設備只能識別MAC地址。IP地址只是主機在網絡層中的地址&#xff0c;如果要將網絡層中傳送的數據報交給…

Linux系統編程--3(exec 函數族,僵尸進程和孤兒進程,wait和wait_pid回收子進程)

exec 函數族 fork 創建子進程后執行的是和父進程相同的程序&#xff08;但有可能執行不同的代碼分支&#xff09; &#xff0c;子進程往往要調用一種 exec 函數以執行另一個程序。當進程調用一種 exec 函數時&#xff0c;該進程的用戶空間代碼和數據完全被新程序替換&#xff…

交換機MAC地址學習和轉發數據幀的原理

1 &#xff1a;交換機 MAC 地址學習在交換機初始化的&#xff0c;也就是剛啟動的時候&#xff0c;交換機的MAC地址表是沒有任何MAC地址和端口的映射條目的 當PCA要想和PCC&#xff0c;PCB,PCD進行通信時&#xff0c;當該二層數據幀通過端口E1/0/1發送到交換機上時&#xff0c…

Linux系統編程---4(進程間通信IPC,管道)

進程間通信目的 數據傳輸&#xff1a;一個進程需要將它的數據發送給另一個進程資源共享&#xff1a;多個進程之間共享同樣的資源。通知事件&#xff1a;一個進程需要向另一個或一組進程發送消息&#xff0c;通知它&#xff08;它們&#xff09;發生了某種事件&#xff08;如進…

沖突域 廣播域簡單解釋

網絡互連設備可以將網絡劃分為不同的沖突域、廣播域。但是&#xff0c;由于不同的網絡互連設備可能工作在OSI模型的不同層次上。因此&#xff0c;它們劃分沖突域、廣播域的效果也就各不相同。如中繼器工作在物理層&#xff0c;網橋和交換機工作在數據鏈路層&#xff0c;路由器工…

Linux系統編程---5(共享存儲映射,存儲映射I/O,mmap函數,父子進程間通信,匿名映射)

共享存儲映射 文件進程間通信 使用文件也可以完成 IPC&#xff0c;理論依據是&#xff0c;fork 后&#xff0c;父子進程共享文件描述符。也就共享打開的文件。 編程&#xff1a;父子進程共享打開的文件。借助文件進行進程間通信。 測試代碼 /*** 父子進程共享打開的文件描述…

變量的存取

一、預備知識―程序的內存分配 一個由c/C編譯的程序占用的內存分為以下幾個部分 1、棧區&#xff08;stack&#xff09;― 由編譯器自動分配釋放 &#xff0c;存放函數的參數值&#xff0c;局部變量的值等。其操作方式類似于數據結構中的棧。 2、堆區&#xff08;heap&#xff…

Linux下文件的多進程拷貝

大文件拷貝 假設有一個超大文件&#xff0c;需對其完成拷貝工作。為提高效率&#xff0c;可采用多進程并行拷貝的方法來實現。假設文件 大小為 len&#xff0c;共有 n 個進程對該文件進行拷貝。那每個進程拷貝的字節數應為 len/n。但未必一定能整除&#xff0c;我們可 以選擇讓…

linux下cron定時任務的總結

cron是linux系統下一個自動執行指定任務的程序&#xff0c;即包含“時間”、“路徑”、“自動執行腳本”等要素 當我們要增加全局性的計劃任務時&#xff0c;一種方式是直接修改/etc/crontab。但是&#xff0c;一般不建議這樣做&#xff0c;/etc/cron.d目錄就是為了解決這種問…

Linux系統編程---6(信號的機制,信號4要素,Linu常規信號表,定時器)

信號的概念 信號在我們的生活中隨處可見&#xff0c; 如&#xff1a;古代戰爭中摔杯為號&#xff1b;現代戰爭中的信號彈&#xff1b;體育比賽中使用的信號槍… 他們都有共性&#xff1a; 簡單不能攜帶大量信息&#xff0c;只能帶一個標志。滿足某個特設條件才發送。 Unix 早…

python httplib2的安裝

window下python安裝httplib2 https://pypi.python.org/pypi/httplib2地址下下載httplib2安裝包&#xff0c;并解壓縮 方法一、我的電腦->屬性->高級->環境變量->系統變量 在系統變量里找到PATH&#xff0c;雙擊PATH&#xff0c;在結尾加上 ";C:\Python25&…

Linux系統編程----7(信號集,信號屏蔽,信號捕捉)

信號集操作函數 內核通過讀取未決信號集來判斷信號是否應被處理。信號屏蔽字 mask 可以影響未決信號集。而我們可以在應 用程序中自定義 set 來改變 mask。已達到屏蔽指定信號的目的。 信號集設定 sigset_t set; //typedef unsigned long sigset_t;int sigemptyset(sigset_t…

Linux系統編程----8(競態條件,時序競態,pause函數,如何解決時序競態)

競態條件(時序競態)&#xff1a; pause 函數 調用該函數可以造成進程主動掛起&#xff0c;等待信號喚醒。調用該系統調用的進程將處于阻塞狀態(主動放棄 cpu) 直 到有信號遞達將其喚醒&#xff0c;等不到一直等 int pause(void); 返回值&#xff1a;-1 并設置 errno 為 EINTR…

Linux系統編程---8(全局變量異步I/O,可重入函數)

全局變量異步 I/O 分析如下父子進程交替 數數 程序。當捕捉函數里面的 sleep 取消&#xff0c;程序即會出現問題。請分析原因。 #include<stdio.h> #include<signal.h> #include<unistd.h> #include<stdlib.h>intn0,flag0; void sys_err(char* s…

http使用post上傳文件時,請求頭和主體信息總結

請求頭必須配置如下行&#xff1a; Content-Type : multipart/form-data; boundary---12321 boundary---12321位文件的分界線 body如下&#xff1a; "-----12321\r\n" //分割文件時加-- "Content-Disposition: form-data; name\"…

iconv 文件編碼轉換

iconv 文件編碼轉換 http://qq164587043.blog.51cto.com/261469/63349 linux shell 配置文件中默認的字符集編碼為UTF&#xff0d;8 。UTF&#xff0d;8是unicode的一種表達方式&#xff0c;gb2312是和unicode都是字符的編碼方式&#xff0c;所以說gb2312跟utf&#xff0d;8的…

Linu系統編程---9(SIGCHLD 信號,信號傳參,中斷系統調用)

SIGCHLD 信號 SIGCHLD 的產生條件 子進程終止時子進程接收到 SIGSTOP 信號停止時子進程處在停止態&#xff0c;接受到 SIGCONT 后喚醒時 借助 SIGCHLD 信號回收子進程 子進程結束運行&#xff0c;其父進程會收到 SIGCHLD 信號。該信號的默認處理動作是忽略。可以捕捉該信號…