STL中list的使用(理論)

STL中的list就是一雙向鏈表,可高效地進行插入刪除元素。現總結一下它的操作。

文中所用到兩個list對象c1,c2分別有元素c1(10,20,30) c2(40,50,60)。還有一個list<int>::iterator citer用來指向c1或c2元素。

list對象的聲明構造():

A.? ? ? list<int>c0;? ? ? ? ? ? ? ? //空鏈表

B.? ? ? list<int>c1(3);? ? ? ? ? ? //建一個含三個默認值是0的元素的鏈表

C.? ? ? list<int>c2(5,2);? ? ? ? ? ? //建一個含五個元素的鏈表,值都是2

D.? ? ? list<int>c4(c2);? ? ? ? ? ? //建一個c2的copy鏈表

E.? ? ? list<int>c5(c1.begin(),c1.end());?

//c5含c1一個區域的元素[_First, _Last)。


1.? ? ? assign()分配值,有兩個重載:

c1.assign(++c2.begin(), c2.end()) //c1現在為(50,60)。

c1.assing(7,4) //c1中現在為7個4,c1(4,4,4,4,4,4,4)。

2.? ? ? back()返回最后一元素的引用:

int i=c1.back(); //i=30

const int i=c2.back(); //i=60且不可修改

3.? ? ? begin()返回第一個元素的指針(iterator)

citer=c1.begin();? ? // *citer=10

list<int>::const_iterator cciter=c1.begin(); //*cciter=10且為const。

4.? ? ? clear()刪除所有元素

c1.clear();? //c1為空 c1.size為0;

5.? ? ? empty()判斷是否鏈表為空

bool B=c1.empty(); //若c1為空B=true;否則B=false;

6.? ? ? end()返回最后一個元素的下一位置的指針(list為空時end()=begin())

citer=c1.end(); //*(--citer)=30;

同begin()返回一個常指針,不能修改其中元素。

7.? ? ? erase()刪除一個元素或一個區域的元素(兩個重載)

c1.erase(c1.begin()); // c1現為(20,30);

c1.erase(++c1.begin(),c1.end()); // c1現為(10);

8.? ? ? front() 返回第一個元素的引用:

int i=c1.front(); //i=10;

const int i=c1.front(); //i=10且不可修改。

9.? ? ? insert()在指定位置插入一個或多個元素(三個重載):

c1.insert(++c1.begin(),100);? //c1(10,100,20,30)

c1.insert(c1.begin(),2,200); //c1(200,200,20,30);

c1.insert(++c1.begin(),c2.begin(),--c2.end());

//c1(10,40,50,20,30);

10.? ? max_size()返回鏈表最大可能長度(size_type就是int型):

list<int>::size_type i=c1.max_size(); //i=1073741823

11.? ? merge()合并兩個鏈表并使之默認升序(也可改):

c2.merge(c1);? //c1現為空;c2現為c2(10,20,30,40,50,60)

c2.merge(c1,greater<int>()); //同上,但c2現為降序

12.? ? pop_back()刪除鏈表尾的一個元素

c1.pop_back() //c1(10,20);

13.? ? pop_front()刪除鏈表頭的一元素

c1.pop_front() //c1(20,30)

14.? ? push_back()增加一元素到鏈表尾

c1.push_back(100) //c1(10,20,30,100)

15.? ? push_front()增加一元素到鏈表頭

c1.push_front(100) //c1(100,10,20,30)

16.? ? rbegin()返回鏈表最后一元素的后向指針(reverse_iterator or const)

list<int>::reverse_iterator riter=c1.rbegin(); //*riter=30

17.? ? rend()返回鏈表第一元素的下一位置的后向指針

list<int>::reverse_iterator riter=c1.rend(); // *(--riter)=10

18.? ? remove()刪除鏈表中匹配值的元素(匹配元素全部刪除)

c1.remove(10);? ? //c1(20,30)

19.? ? remove_if()刪除條件滿足的元素(會遍歷一遍鏈表)

c1.remove_if( is_odd<int> () ); //c1(10,20,30) 

//is_odd自己寫(表奇數) 

20.? ? resize()重新定義鏈表長度(兩重載):

c1.resize(4) //c1(10,20,30,0)用默認值填補

c1.resize(4,100) //c1(10,20,30,100)用指定值填補

21.? ? reverse()反轉鏈表:

c1.reverse(); //c1(30,20,10)

22.? ? size()返回鏈表中元素個數

list<int>::size_type i=c1.size(); //i=3

23.? ? sort()對鏈表排序,默認升序(可自定義)

c1.sort(); //c1(10,20,30)

c1.sort(great<int>()); //c1(30,20,10)

24.? ? splice()對兩個鏈表進行結合(三個重載)

c1.splice(++c1.begin(),c2);

//c1(10,40,50,60,20,30) c2為空 全合并

c1.splice(++c1.begin(),c2,++c2.begin());

//c1(10,50,20,30) ; c2(40,60) 指定元素合并

c1.splice(++c1.begin(),c2,++c2.begin(),c2.end());

//c1(10,50,60,20,30); c2(40) 指定范圍合并

25.? ? swap()交換兩個鏈表(兩個重載)

c1.swap(c2); //c1(40,50,60);

swap(c1,c2); //c1(40,50,60)

26.? ? unique()刪除相鄰重復元素(斷言已經排序,因為它不會刪除不相鄰的相同元素)

c1.unique();

//假設c1開始(-10,10,10,20,20,-10)則之后為c1(-10,10,20,-10)

c1.unique(mypred); //自定義謂詞








C++ Lists(鏈表)

Lists將元素按順序儲存在鏈表中. 與 向量(vectors)相比, 它允許快速的插入和刪除,但是隨機訪問卻比較慢.


assign() 給list賦值
back() 返回最后一個元素
begin() 返回指向第一個元素的迭代器
clear() 刪除所有元素
empty() 如果list是空的則返回true
end() 返回末尾的迭代器
erase() 刪除一個元素
front() 返回第一個元素
get_allocator() 返回list的配置器
insert() 插入一個元素到list中
max_size() 返回list能容納的最大元素數量
merge() 合并兩個list
pop_back() 刪除最后一個元素
pop_front() 刪除第一個元素
push_back() 在list的末尾添加一個元素
push_front() 在list的頭部添加一個元素
rbegin() 返回指向第一個元素的逆向迭代器
remove() 從list刪除元素
remove_if() 按指定條件刪除元素
rend() 指向list末尾的逆向迭代器
resize() 改變list的大小
reverse() 把list的元素倒轉
size() 返回list中的元素個數
sort() 給list排序
splice() 合并兩個list
swap() 交換兩個list
unique() 刪除list中重復的元素

附List用法實例:

#include <iostream>
#include <list>
#include <numeric>
#include <algorithm>

using namespace std;

//創建一個list容器的實例LISTINT
typedef list<int> LISTINT;

//創建一個list容器的實例LISTCHAR
typedef list<char> LISTCHAR;

void main(void)
{
??? //--------------------------
??? //用list容器處理整型數據
??? //--------------------------
??? //用LISTINT創建一個名為listOne的list對象
??? LISTINT listOne;
??? //聲明i為迭代器
??? LISTINT::iterator i;

??? //從前面向listOne容器中添加數據
??? listOne.push_front (2);
??? listOne.push_front (1);

??? //從后面向listOne容器中添加數據
??? listOne.push_back (3);
??? listOne.push_back (4);

??? //從前向后顯示listOne中的數據
??? cout<<"listOne.begin()--- listOne.end():"<<endl;
??? for (i = listOne.begin(); i != listOne.end(); ++i)
??????? cout << *i << " ";
??? cout << endl;

??? //從后向后顯示listOne中的數據
LISTINT::reverse_iterator ir;
??? cout<<"listOne.rbegin()---listOne.rend():"<<endl;
??? for (ir =listOne.rbegin(); ir!=listOne.rend();ir++) {
??????? cout << *ir << " ";
??? }
??? cout << endl;

??? //使用STL的accumulate(累加)算法
??? int result = accumulate(listOne.begin(), listOne.end(),0);
??? cout<<"Sum="<<result<<endl;
??? cout<<"------------------"<<endl;

??? //--------------------------
??? //用list容器處理字符型數據
??? //--------------------------

??? //用LISTCHAR創建一個名為listOne的list對象
??? LISTCHAR listTwo;
??? //聲明i為迭代器
??? LISTCHAR::iterator j;

??? //從前面向listTwo容器中添加數據
??? listTwo.push_front ('A');
??? listTwo.push_front ('B');

??? //從后面向listTwo容器中添加數據
??? listTwo.push_back ('x');
??? listTwo.push_back ('y');

??? //從前向后顯示listTwo中的數據
??? cout<<"listTwo.begin()---listTwo.end():"<<endl;
??? for (j = listTwo.begin(); j != listTwo.end(); ++j)
??????? cout << char(*j) << " ";
??? cout << endl;

??? //使用STL的max_element算法求listTwo中的最大元素并顯示
??? j=max_element(listTwo.begin(),listTwo.end());
??? cout << "The maximum element in listTwo is: "<<char(*j)<<endl;
}

#include <iostream>
#include <list>

using namespace std;
typedef list<int> INTLIST;

//從前向后顯示list隊列的全部元素
void put_list(INTLIST list, char *name)
{
??? INTLIST::iterator plist;

??? cout << "The contents of " << name << " : ";
??? for(plist = list.begin(); plist != list.end(); plist++)
??????? cout << *plist << " ";
??? cout<<endl;
}

//測試list容器的功能
void main(void)
{
//list1對象初始為空
??? INTLIST list1;??
??? //list2對象最初有10個值為6的元素
??? INTLIST list2(10,6);
??? //list3對象最初有3個值為6的元素
??? INTLIST list3(list2.begin(),--list2.end());

??? //聲明一個名為i的雙向迭代器
??? INTLIST::iterator i;

??? //從前向后顯示各list對象的元素
??? put_list(list1,"list1");
??? put_list(list2,"list2");
??? put_list(list3,"list3");
???
//從list1序列后面添加兩個元素
list1.push_back(2);
list1.push_back(4);
cout<<"list1.push_back(2) and list1.push_back(4):"<<endl;
??? put_list(list1,"list1");

//從list1序列前面添加兩個元素
list1.push_front(5);
list1.push_front(7);
cout<<"list1.push_front(5) and list1.push_front(7):"<<endl;
??? put_list(list1,"list1");

//在list1序列中間插入數據
list1.insert(++list1.begin(),3,9);
cout<<"list1.insert(list1.begin()+1,3,9):"<<endl;
??? put_list(list1,"list1");

//測試引用類函數
cout<<"list1.front()="<<list1.front()<<endl;
cout<<"list1.back()="<<list1.back()<<endl;

//從list1序列的前后各移去一個元素
list1.pop_front();
list1.pop_back();
cout<<"list1.pop_front() and list1.pop_back():"<<endl;
??? put_list(list1,"list1");

//清除list1中的第2個元素
list1.erase(++list1.begin());
cout<<"list1.erase(++list1.begin()):"<<endl;
??? put_list(list1,"list1");

//對list2賦值并顯示
list2.assign(8,1);
cout<<"list2.assign(8,1):"<<endl;
??? put_list(list2,"list2");

//顯示序列的狀態信息
cout<<"list1.max_size(): "<<list1.max_size()<<endl;
cout<<"list1.size(): "<<list1.size()<<endl;
cout<<"list1.empty(): "<<list1.empty()<<endl;

//list序列容器的運算
??? put_list(list1,"list1");
??? put_list(list3,"list3");
cout<<"list1>list3: "<<(list1>list3)<<endl;
cout<<"list1<list3: "<<(list1<list3)<<endl;

//對list1容器排序
list1.sort();
??? put_list(list1,"list1");
???
//結合處理
list1.splice(++list1.begin(), list3);
??? put_list(list1,"list1");
??? put_list(list3,"list3");
}

補充:STL標準函數find進行vector 、list鏈表查找

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

class example
{
public:
example(int val)
{
i = val;
}

bool operator==(example const & rhs)
{
return (i == rhs.i) ? true : false;
}

private:
int i;
};
using namespace std;
int main(void)
{
vector<example> ve;
ve.push_back(1);
vector<example>::iterator it;
example elem(1);
it = find(ve.begin(), ve.end(), elem);
cout<<boolalpha<<(*it == elem);
}

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

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

相關文章

C#數據類型轉換—使用Convert類轉換

文章目錄簡介用例博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 簡介 System.Covert類就是專門進行類型轉換的類&#xff0c;Convert類提供的方法可以實現各種進本數據類型之間的轉換。Convert類的常用方法如下表&#xff1a; 方法說明ToBo…

服務器租用單線、雙線、bgp 相比有哪些區別優勢?

2019獨角獸企業重金招聘Python工程師標準>>> 在IDC行業中&#xff0c;服務器的穩定性、安全性是考核服務商的主要指標&#xff0c;影響這兩個指標的因素有很多&#xff0c;其中比較重要的有三個&#xff0c;分別是服務器的配置、機房骨干網寬帶和機房的線路。我們常…

SQL Server 數據庫的維護(四)__游標(cursor)

--維護數據庫-- --游標(cursor)-- --概述&#xff1a; 注&#xff1a;使用select語句查詢結果的結果集是一個整體&#xff0c;如果想每次處理一行或一部分行數據&#xff0c;游標可以提供這種處理機制。可以將游標理解為指針。指針指向哪條記錄&#xff0c;哪條記錄即是被操作記…

關于在unity中動態獲取字符串后在InputField上進行判斷的BUG

今天想做一個簡單的密碼鎖定控制功能&#xff0c;但是出現了問題。我是在游戲開始時讀取streamingAsset中的text中的文本&#xff0c;其實就是密碼如下圖密碼是123456789 然后我在程序中輸入了該密碼出現錯誤&#xff0c;居然錯了。 然后我打印讀取的文本信息是什么、沒錯啊。然…

轉載 調用xvid 實現解碼

2011-06-01 00:26:14) 轉載view plaincopy to clipboardprint? /// intinit_decoder() { intret; xvid_gbl_init_t xvid_gbl_init; xvid_dec_create_txvid_dec_create; memset(&xvid_gbl_init, 0,sizeof(xvid_gbl_init_t)); memset(…

C# 數值和字符串之間的相互轉換

文章目錄方法用例ToString&#xff08;&#xff09;方法Parse&#xff08;&#xff09;方法博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 方法 ToString&#xff08;&#xff09;方法&#xff1a;數值類型的 ToString&#xff08;&#xff…

LeetCode Reverse Words in a String III

原題鏈接在這里&#xff1a;https://leetcode.com/problems/reverse-words-in-a-string-iii/#/description 題目&#xff1a; Given a string, you need to reverse the order of characters in each word within a sentence while still preserving whitespace and initial wo…

創業感悟:技術兄弟為什么一直沒有起來(1)

相信很多做技術的朋友&#xff0c;看到“人脈”兩個字&#xff0c;就顯得有些敏感&#xff0c;有人甚至產生一種“抵觸”的心理。 因為在很多人的心中&#xff0c;會自動的把“人脈”和“關系”關聯起來&#xff0c;會把“人脈”與“走后門”&#xff0c;甚至會和“酒桌文化”&…

kali開啟ssh

修改 vi /etc/ssh/sshd_config 1.將 permitrootlogin 前面的注釋去掉,并且后面改為yes 如果沒有則添加permitrootlogin yes 2.將#PasswordAuthentication no的注釋去掉&#xff0c;并且將NO修改為YES //kali中默認是yes 3.按Esc , 同時按shift和冒號鍵 ,輸入wq &#xff0c;回…

C# 引用類型與值類型轉換-裝箱和拆箱

文章目錄簡介用例裝箱拆箱博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 簡介 拆箱就是把 “引用” 類型轉化為 “值” 類型&#xff1b; 裝箱就是把 “值” 類型轉化為 “引用” 類型&#xff1b; 裝箱與拆箱是數據類型轉換的一種特殊應用…

XVID基本參數解析

XVID&#xff0c;X264等是MPEG4、H264標準的開源編碼器&#xff0c;其中X264只有編碼部分&#xff0c;解碼部分需要FFMPEG完成&#xff1b;XVID有編解碼部分&#xff0c;其中解碼亦可以利用FFMPEG中的MPEG4完成解碼。視頻壓縮算法的計算復雜度&#xff0c;都是比較高的。其中具…

自己整理的openresty安裝步驟

這幾天一直在研究對webapi的限流和名單的問題&#xff0c;于是看了開濤博客的方案&#xff0c;于是就用到了openresty&#xff0c;一個把Nginx和lua集成的東西。 下面就是整理的安裝方案&#xff08;簡單使用基本可以這么安裝&#xff09; 下載openresty&#xff08;centos上下…

京東入職一周感悟:4個匹配和4個觀點

入職一周啦&#xff0c;隨便寫點。一、京東之緣1、我和京東之間的4點匹配Ⅰ技術2008年9月到2016年9月&#xff0c;一直堅持自學技術。京東&#xff0c;是一家商業化的互聯網公司&#xff0c;有技術積淀&#xff0c;有發揮空間。作為技術人員&#xff0c;職業匹配。Ⅱ讀書大學的…

C#賦值運算符及解析

文章目錄博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 賦值運算符對運算符右邊的操作式求值&#xff0c;并用該值設置運算符左邊的變量操作式。賦值運算符主要有簡單賦值及復合賦值運算符&#xff1b;可以放在賦值運算符左邊的對象類型是變量…

mysql 案例 ~ pt修復工具的使用

簡介:今天咱們來聊聊PT修復工具pt-table-sync 注意事項&#xff1a; 1 表要有主鍵或者唯一鍵 2 針對每一個chunk加的是for update鎖 3 修復過程中不能容忍從庫延遲 如果從庫延遲太多&#xff0c;pt-table-sync會長期持有對chunk的for update鎖&#xff0c;然后等待從庫的…

mpeg2,mpeg4,h264編碼標準的異同

1、宏塊匹配像素精度&#xff1a; MPEG2中&#xff0c;運動估計的精度是1/2的像素&#xff0c;通過線性插值實現&#xff08;可能有簡單修正&#xff09;&#xff1b; H264和MPEG4 都可以支持1/4像素的精度 2、參考幀的數量&#xff1a;MPEG2&#xff0c;MPEG4的P幀只能有一幀…

四十歲學編程(一)

有時想想&#xff0c;人生還真的是曲折&#xff0c;人到中年了&#xff0c;我才開始學編程。 這一學&#xff0c;就是三年多&#xff0c;我居然堅持了下來。 更沒想到的是&#xff0c;三年后的我居然有勇氣投簡歷求職前端&#xff0c;雖然面試前戰戰兢兢。 很多時候&#xff0c…

01_SQlite數據庫簡介

轉載于:https://www.cnblogs.com/ZHONGZHENHUA/p/7023014.html

GNU Make 使用手冊(中譯版)

翻譯&#xff1a;于鳳昌譯者注&#xff1a;本人在閱讀Linux源代碼過程中發現如果要全面了解Linux的結構、理解Linux的編程總體設計及思想必須首先全部讀通Linux源代碼中各級的Makefile文件。目前&#xff0c;在網上雖然有一些著作&#xff0c;但都不能全面的解釋Linux源代碼中各…

基礎10 多進程、協程(multiprocessing、greenlet、gevent、gevent.monkey、select、selector)...

1.多進程實現方式&#xff08;類似于多線程&#xff09; 1 import multiprocessing2 import time,threading3 4 def thread_run():#定義一個線程函數5 print("我是子線程%s" %threading.get_ident()) #threading.get_ident()函數獲取當前線程的id6 def run(name…