[cpp] view plaincopy List(鏈表)??
List將元素按順序儲存在鏈表中. 與 向量(vectors)相比, 它允許快速的插入和刪除,但是隨機(jī)訪問卻比較慢.
list對象函數(shù)
assign() 給list賦值?
back() 返回最后一個元素?
begin() 返回指向第一個元素的迭代器?
clear() 刪除所有元素?
empty() 如果list是空的則返回true?
end() 返回末尾的迭代器?
erase() 刪除一個元素?
front() 返回第一個元素?
get_allocator() 返回list的配置器?
insert() 插入一個元素到list中?
max_size() 返回list能容納的最大元素數(shù)量?
merge() 合并兩個list?
pop_back() 刪除最后一個元素?
pop_front() 刪除第一個元素?
push_back() 在list的末尾添加一個元素?
push_front() 在list的頭部添加一個元素?
rbegin() 返回指向第一個元素的逆向迭代器?
remove() 從list刪除元素?
remove_if() 按指定條件刪除元素?
rend() 指向list末尾的逆向迭代器?
resize() 改變list的大小?
reverse() 把list的元素倒轉(zhuǎn)?
size() 返回list中的元素個數(shù)?
sort() 給list排序?
splice() 合并兩個list?
swap() 交換兩個list?
unique() 刪除list中重復(fù)的元素
List實例代碼
[cpp] view plaincopy #include?<iostream>??#include?<list>??#include?<numeric>??#include?<algorithm>????using?namespace?std;??????typedef?list<int>?LISTINT;??????typedef?list<char>?LISTCHAR;????int?main(void)??{??????????????????????????????LISTINT?listOne;????????????LISTINT::iterator?i;??????????????listOne.push_front?(2);??????listOne.push_front?(1);??????????????listOne.push_back?(3);??????listOne.push_back?(4);??????????????cout<<"listOne.begin()---?listOne.end():"<<endl;??????for?(i?=?listOne.begin();?i?!=?listOne.end();?++i)??????????cout?<<?*i?<<?"?";??????cout?<<?endl;??????????????LISTINT::reverse_iterator?ir;??????cout<<"listOne.rbegin()---listOne.rend():"<<endl;??????for?(ir?=listOne.rbegin();?ir!=listOne.rend();ir++)?{??????????cout?<<?*ir?<<?"?";??????}??????cout?<<?endl;??????????????int?result?=?accumulate(listOne.begin(),?listOne.end(),0);??????cout<<"Sum="<<result<<endl;??????cout<<"------------------"<<endl;??????????????????????????????????LISTCHAR?listTwo;????????????LISTCHAR::iterator?j;??????????????listTwo.push_front?('A');??????listTwo.push_front?('B');??????????????listTwo.push_back?('x');??????listTwo.push_back?('y');??????????????cout<<"listTwo.begin()---listTwo.end():"<<endl;??????for?(j?=?listTwo.begin();?j?!=?listTwo.end();?++j)??????????cout?<<?char(*j)?<<?"?";??????cout?<<?endl;??????????????j=max_element(listTwo.begin(),listTwo.end());??????cout?<<?"The?maximum?element?in?listTwo?is:?"<<char(*j)<<endl;????????return?0;??}??
vector相關(guān)用法
vector的初始化大小和賦初值
(1)vector< 類型 > 標(biāo)識符 ;
(2)vector< 類型 > 標(biāo)識符(最大容量) ;
(3)vector< 類型 > 標(biāo)識符(最大容量,初始所有值);
vector< int > arry(5, 1);
注:定義一個大小為5的數(shù)組,并將每個值都賦為1;
int i;
for( i = 0; i < 5; i ++ )
cout << arry[i] << " ";
輸出結(jié)果為:1 1 1 1 1
同理定義其他類型的:
vector<char> arry(3, '*');
定義二維的vector:
vector< vector <int>> Arry(10, vector<int>(0));
?
使用數(shù)組對C++ Vector進(jìn)行初始化
int i[10] ={1,2,3,4,5,6,7,78,8} ; ?
///第一種 ??
vector<int> vi(i+1,i+3); ///從第2個元素到第三個元素 ?
for(vector <int>::interator it = vi.begin() ;?
it != vi.end() ; it++) ?
{ ?
cout << *it <<" " ; ??
}?
?vector 的數(shù)據(jù)的存入和輸出:
[cpp] view plaincopy #include?<iostream>??#include?<vector>??#include?<algorithm>??#include?<cstdlib>??using?namespace?std;?????int?main(void)??{?????vector<int>?num;????????int?element;??????????????????while?(cin?>>?element)?????????????num.push_back(element);?????????????sort(vi.begin()?,?vi.end());??????reverse(vi.begin(),vi.end())?????????????????for?(int?i?=?0;?i?<?num.size();?i?++)????????cout?<<?num[i]?<<?"\n";???????????????????????system("pause");?????return?0;??}??
?對于二維vector的定義。
1)定義一個10個vector元素,并對每個vector符值1-10。
[cpp] view plaincopy #include<stdio.h>??#include<vector>??#include?<iostream>??using?namespace?std;??int?main()??{???int?i?=?0,?j?=?0;????所?以每一行的長度是可以變化的。之所以用到vector<int>(0)是對vector初始化,否則不能對vector存入元素。???vector<?vector<int>?>?Array(?10,?vector<int>(0)?);???for(?j?=?0;?j?<?10;?j++?)???{????for?(?i?=?0;?i?<?9;?i++?)????{?????Array[?j?].push_back(?i?);????}???}???for(?j?=?0;?j?<?10;?j++?)???{????for(?i?=?0;?i?<?Array[?j?].size();?i++?)????{?????cout?<<?Array[?j?][?i?]?<<?"??";????}????cout<<?endl;???}??}??
定義一個行列都是變化的數(shù)組。
[cpp] view plaincopy #include<stdio.h>??#include<vector>??#include?<iostream>??using?namespace?std;??void?main()??{???int?i?=?0,?j?=?0;???vector<?vector<int>?>?Array;???vector<?int?>?line;???for(?j?=?0;?j?<?10;?j++?)???{????Array.push_back(?line?);????for?(?i?=?0;?i?<?9;?i++?)????{?????Array[?j?].push_back(?i?);????}???}???for(?j?=?0;?j?<?10;?j++?)???{????for(?i?=?0;?i?<?Array[?j?].size();?i++?)????{?????cout?<<?Array[?j?][?i?]?<<?"??";????}????cout<<?endl;??
[cpp] view plaincopy <span?style="white-space:pre">??</span>return?0;???}??}??
使 用 vettor erase 指定元素
[cpp] view plaincopy #include?<iostream>??#include?<vector>????using?namespace?std;????int???main()??{??????vector<int>???arr;??????arr.push_back(6);??????arr.push_back(8);??????arr.push_back(3);??????arr.push_back(8);????????for(vector<int>::iterator?it=arr.begin();?it!=arr.end();?)??????{??????????if(*?it?==?8)??????????{??????????????it?=?arr.erase(it);??????????}??????????else??????????{??????????????++it;??????????}??????}????????cout?<<?"After?remove?8:\n";????????for(vector<int>::iterator?it?=?arr.begin();?it?<?arr.end();?++it)??????{??????????cout?<<?*?it?<<?"?";??????}??????cout?<<?endl;??????return?0;??}??
附:
?1.push_back ? ?在數(shù)組的最后添加一個數(shù)據(jù)
?2.pop_back ? ? 去掉數(shù)組的最后一個數(shù)據(jù)
?3.at ? ? ? ? ? ? ? ? 得到編號位置的數(shù)據(jù)
?4.begin ? ? ? ? ? ?得到數(shù)組頭的指針
?5.end ? ? ? ? ? ? ?得到數(shù)組的最后一個單元+1的指針
?6.front ? ? ? ? 得到數(shù)組頭的引用
?7.back ? ? ? ? ? ? 得到數(shù)組的最后一個單元的引用
?8.max_size ? ? ?得到vector最大可以是多大
?9.capacity ? ? ? ?當(dāng)前vector分配的大小
?10.size ? ? ? ? ? ?當(dāng)前使用數(shù)據(jù)的大小
?11.resize ? ? ? ? ?改變當(dāng)前使用數(shù)據(jù)的大小,如果它比當(dāng)前使用的大,者填充默認(rèn)值
v.resize(2*v.size, 99) 將v的容量翻倍(并把新元素的值初始化為99)
?12.reserve ? ? ? 改變當(dāng)前vecotr所分配空間的大小
?13.erase ? ? ? ? ?刪除指針指向的數(shù)據(jù)項
?14.clear ? ? ? ? ? 清空當(dāng)前的vector
?15.rbegin ? ? ? ? 將vector反轉(zhuǎn)后的開始指針返回(其實就是原來的end-1)
?16.rend ? ? ? ? ? 將vector反轉(zhuǎn)構(gòu)的結(jié)束指針返回(其實就是原來的begin-1)
?17.empty ? ? ? ? 判斷vector是否為空
?18.swap ? ? ? ? ?與另一個vector交換數(shù)據(jù)
map用法
1、map簡介
map是一類關(guān)聯(lián)式容器。它的特點是增加和刪除節(jié)點對迭代器的影響很小,除了那個操作節(jié)點,對其他的節(jié)點都沒有什么影響。對于迭代器來說,可以修改實值,而不能修改key。
2、map的功能
自動建立Key - value的對應(yīng)。key 和 value可以是任意你需要的類型。?
根據(jù)key值快速查找記錄,查找的復(fù)雜度基本是Log(N),如果有1000個記錄,最多查找10次,1,000,000個記錄,最多查找20次。?
快速插入Key - Value 記錄。?
快速刪除記錄?
根據(jù)Key 修改value記錄。?
遍歷所有記錄。?
3、使用map
使用map得包含map類所在的頭文件
#include <map> //注意,STL頭文件沒有擴(kuò)展名.h
map對象是模板類,需要關(guān)鍵字和存儲對象兩個模板參數(shù):
std:map<int, string> personnel;
這樣就定義了一個用int作為索引,并擁有相關(guān)聯(lián)的指向string的指針.
為了使用方便,可以對模板類進(jìn)行一下類型定義,
typedef map<int, CString> UDT_MAP_INT_CSTRING;
UDT_MAP_INT_CSTRING enumMap;
4、在map中插入元素
改變map中的條目非常簡單,因為map類已經(jīng)對[]操作符進(jìn)行了重載
enumMap[1] = "One";
enumMap[2] = "Two";
.....
這樣非常直觀,但存在一個性能的問題。插入2時,先在enumMap中查找主鍵為2的項,沒發(fā)現(xiàn),然后將一個新的對象插入enumMap,鍵是2,值是一個空字符串,插入完成后,將字符串賦為"Two"; 該方法會將每個值都賦為缺省值,然后再賦為顯示的值,如果元素是類對象,則開銷比較大。我們可以用以下方法來避免開銷:
enumMap.insert(map<int, CString> :: value_type(2, "Two"))
5、查找并獲取map中的元素
下標(biāo)操作符給出了獲得一個值的最簡單方法:
CString tmp = enumMap[2];
但是,只有當(dāng)map中有這個鍵的實例時才對,否則會自動插入一個實例,值為初始化值。
我們可以使用Find()和Count()方法來發(fā)現(xiàn)一個鍵是否存在。
查找map中是否包含某個關(guān)鍵字條目用find()方法,傳入的參數(shù)是要查找的key,在這里需要提到的是begin()和end()兩個成員,分別代表map對象中第一個條目和最后一個條目,這兩個數(shù)據(jù)的類型是iterator.
int nFindKey = 2; //要查找的Key
//定義一個條目變量(實際是指針)
UDT_MAP_INT_CSTRING::iterator it= enumMap.find(nFindKey);
if(it == enumMap.end()) {
//沒找到
}
else {
//找到
}
通過map對象的方法獲取的iterator數(shù)據(jù)類型是一個std::pair對象,包括兩個數(shù)據(jù) iterator->first 和 iterator->second 分別代表關(guān)鍵字和存儲的數(shù)據(jù)
6、從map中刪除元素
移除某個map中某個條目用erase()
該成員方法的定義如下
iterator erase(iterator it); //通過一個條目對象刪除?
iterator erase(iterator first, iterator last); //刪除一個范圍?
size_type erase(const Key& key); //通過關(guān)鍵字刪除?
clear()就相當(dāng)于 enumMap.erase(enumMap.begin(), enumMap.end());
C++ STL map的使用
以下是對C++中STL map的插入,查找,遍歷及刪除的例子:
[cpp] view plaincopy #include?<map>???#include?<string>???#include?<iostream>???using?namespace?std;????void?map_insert(map?<?string,?string?>?*mapStudent,?string?index,?string?x)???{???mapStudent->insert(map?<?string,?string?>::value_type(index,?x));???}????int?main(int?argc,?char?**argv)???{???char?tmp[32]?=?"";???map?<?string,?string?>?mapS;??????map_insert(&mapS,?"192.168.0.128",?"xiong");???map_insert(&mapS,?"192.168.200.3",?"feng");???map_insert(&mapS,?"192.168.200.33",?"xiongfeng");????map?<?string,?string?>::iterator?iter;????cout?<<?"We?Have?Third?Element:"?<<?endl;???cout?<<?"-----------------------------"?<<?endl;??????iter?=?mapS.find("192.168.0.33");???if?(iter?!=?mapS.end())?{???cout?<<?"find?the?elememt"?<<?endl;???cout?<<?"It?is:"?<<?iter->second?<<?endl;???}?else?{???cout?<<?"not?find?the?element"?<<?endl;???}??????for?(iter?=?mapS.begin();?iter?!=?mapS.end();?iter?)?{????cout?<<?"|?"?<<?iter->first?<<?"?|?"?<<?iter->???second?<<?"?|"?<<?endl;????}???cout?<<?"-----------------------------"?<<?endl;????map_insert(&mapS,?"192.168.30.23",?"xf");????cout?<<?"After?We?Insert?One?Element:"?<<?endl;???cout?<<?"-----------------------------"?<<?endl;???for?(iter?=?mapS.begin();?iter?!=?mapS.end();?iter?)?{????cout?<<?"|?"?<<?iter->first?<<?"?|?"?<<?iter->???second?<<?"?|"?<<?endl;???}????cout?<<?"-----------------------------"?<<?endl;??????iter?=?mapS.find("192.168.200.33");???if?(iter?!=?mapS.end())?{???cout?<<?"find?the?element:"?<<?iter->first?<<?endl;???cout?<<?"delete?element:"?<<?iter->first?<<?endl;???cout?<<?"================================="?<<?endl;???mapS.erase(iter);???}?else?{???cout?<<?"not?find?the?element"?<<?endl;???}???for?(iter?=?mapS.begin();?iter?!=?mapS.end();?iter?)?{????cout?<<?"|?"?<<?iter->first?<<?"?|?"?<<?iter->???second?<<?"?|"?<<?endl;????}???cout?<<?"================================="?<<?endl;????return?0;???}??
本文參考:
http://blog.csdn.net/lyn_bigdream/article/details/6601510
http://blog.sina.com.cn/s/blog_63a1163f0100jxr9.html
http://wmnmtm.blog.163.com/blog/static/38245714201072310131130/
總結(jié)
以上是生活随笔為你收集整理的C++ 标准库 vector list map使用方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。