MFC中STL容器中Vector,List,Map基本用法汇总
容器就是數據結構的泛指,迭代器就是指針的泛指,可以指向元素。它可以用來存儲數據,就比如杯子用來裝水一樣。而STL中的容器有很多,它包括vector,list,map,deque,set等。我就簡單列舉vector,list,map為例吧,
1.Vector
又稱向量,跟數組結構差不多。它的內存是連續的,擁有與數組一樣的特點,但它又更加靈活,可以在首尾兩端插入刪除數據更加方便。支持[]操作符,在中間插入刪除元素效率很低,而且支持擴容。
1)本身屬性與方法:
?1.push_back ???在數組的最后添加一個數據
?2.pop_back ????去掉數組的最后一個數據
?3.at ???????????得到編號位置的數據
?4.begin ???????????得到數組頭的指針
?5.end ?????????????得到數組的最后一個單元+1的指針
?6.front ????????得到數組頭的引用
?7.back ????????????得到數組的最后一個單元的引用
?8.max_size ?????得到vector最大可以是多大
?9.capacity ???????當前vector分配的大小
?10.size ???????????當前使用數據的大小
?11.resize ?????????改變當前使用數據的大小,如果它比當前使用的大,者填充默認值
?12.reserve ??????改變當前vecotr所分配空間的大小
?13.erase ?????????刪除指針指向的數據項
?14.clear ??????????清空當前的vector
?15.rbegin ????????將vector反轉后的開始指針返回(其實就是原來的end-1)
?16.rend ??????????將vector反轉構的結束指針返回(其實就是原來的begin-1)
?17.empty ????????判斷vector是否為空
?18.swap ?????????與另一個vector交換數據
?19.insert(p,elem); ?????在指針p指向的位置插入數據elem,返回指向elem位置的指針???????
?20.insert(p,n,elem); ???在位置p插入n個elem數據,無返回值
?21.insert(p,begin,end) ?在位置p插入在區間[begin,end)的數據,無返回值
2)vector的聲明
???vector<ElemType> c; ??創建一個空的vector
???vector<ElemType> c1(c2); 創建一個vector c1,并用c2去初始化c1
???vector<ElemType> c(n) ; 創建一個含有n個ElemType類型數據的vector;
???vector<ElemType> c(n,elem); 創建一個含有n個ElemType類型數據的vector,并全部初始化為elem;
???c.~vector<ElemType>(); 銷毀所有數據,釋放資源;
3)簡單用法
???//數據存入
???ElemType可以是多種,int,float,double,string,CString,struct等,舉例:
???vector<int> c;
???for(int i=0;i<8;i++)
???{
c.push_back(i);
???}
???//數據刪除
???c.pop_back(pos);//尾刪除
???vector<int>::iterator iter=c.begin();
???for(; iter!=c.end(); ) //指定刪除元素
???{ ?
?????if( *iter == 3) ?
??????????iter = c.erase(iter); ?
??????else ?
??????????iter ++ ; ?
????} ?
由上可以看出,我們可以使用迭代器和循環法兩種方法操作vector,如下:
for ( int i = 0; i < c.size(); ++i )
{
????cout << c[ i ] << ' ';
????cout << endl;
}
但是 更典型的做法是使用 vector 操作集中的begin()和 end()所返回的迭代器 iterator
for ( vector<string>::iterator it = c.begin();it != c.end(); ++it )
{
????????cout << *it << ' ';
????cout << endl;
}
2.List
list是以鏈表形式實現的,不支持[],對于隨機訪問速度慢得多,因為可能要遍歷整個鏈表才能做到,但是
對于插入就快的多了,不需要拷貝和移動數據,只需要改變指針的指向就可以了。
1)本身屬性與方法:
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中重復的元素
2)List的聲明
list< 類型 > 標識符 ;
3)List簡單用法
???list<int> c;
???for(int i=0;i<8;i++)//鏈表插入數據
???{
c.push_back(i);
???}
//刪除數據
??list<int>::iterator ?iter= c.begin();
??while(iter != c.end())
??{
????if( *iter == 3) ?
??????????iter = c.erase(iter); ?
??????else ?
??????????iter ++ ;
??}
3.map
是一類關聯式容器,增加和刪除節點對迭代器的影響很小,除了那個操作節點,對其他的節點都沒有什么影響。對于迭代器來說,可以修改實值,而不能修改key。自動建立Key - value的對應。key 和 value可以是任意你需要的類型,內部遵循哈希表,有可能插入的數據順序改變了。使用給定的Key,可以迅速地從單元集合中檢索到相應的元素。因此,在需要對大量數據進行查找操作而查找的性能又占據重要地位的場合,Map無疑是一種較理想的容器。
1)屬性與方法
?????????????begin()??????????返回指向map頭部的迭代器
??????clear()?????????刪除所有元素
??????count()??????????返回指定元素出現的次數
??????empty()??????????如果map為空則返回true
??????end()????????????返回指向map末尾的迭代器
??????equal_range()????返回特殊條目的迭代器對
??????erase()??????????刪除一個元素
??????find()???????????查找一個元素
??????get_allocator()??返回map的配置器
??????insert()?????????插入元素
??????key_comp()???????返回比較元素key的函數
??????lower_bound()????返回鍵值>=給定元素的第一個位置
??????max_size()???????返回可以容納的最大元素個數
??????rbegin()?????????返回一個指向map尾部的逆向迭代器
??????rend()???????????返回一個指向map頭部的逆向迭代器
??????size()???????????返回map中元素的個數
??????swap()????????????交換兩個map
??????upper_bound()?????返回鍵值>給定元素的第一個位置
??????value_comp()??????返回比較元素value的函數
2)map的聲明
map<key,value>mapst;
3)map的一些用法:
主要簡述一些map的構造方法:
1.用insert函數插入pair數據
Map<int, string> mapArmy;
mapArmy.insert(pair<int, string>(1, “student_one”));
mapArmy.insert(pair<int, string>(2, “student_two”));
mapArmy.insert(pair<int, string>(3, “student_three”));
map<int, string>::iterator ?iter;
for(iter = mapArmy.begin(); iter !=mapArmy.end(); iter++)
{
???????Cout<<iter->first<<” ??”<<iter->second<<end;
}
2.用insert函數插入value_type數據
Map<int, string> mapArmy;
mapArmy.insert(map<int, string>::value_type (1, “劉備”));
mapArmy.insert(map<int, string>::value_type (2, “關羽”));
mapArmy.insert(map<int, string>::value_type (3, “張飛”));
map<int, string>::iterator ?iter;
for(iter = mapArmy.begin(); iter !=mapArmy.end(); iter++)
{
???????Cout<<iter->first<<” ??”<<iter->second<<end;
}
3.第三種:用數組方式插入數據
Map<int, string> mapStudent;
mapStudent[1] = ?“劉備”;
mapStudent[2] = ?“關羽”;
mapStudent[3] = ?“張飛”;
map<int, string>::iterator ?iter;
for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
{
???????Cout<<iter->first<<” ??”<<iter->second<<end;
}
???總體來說,從存儲數組上講vector,list,map有本質上的區別,vector是連續存儲的一段內存;list是鏈式存儲,內存不連續,以地址相連;map是鍵-值對一一對應關系存儲,針對特定數據的;其次數據的訪問效率問題,vector可以快速插入數據,但是問題是訪問任意元素效率并不高,而鏈表主要是插入刪除更加方面,只是指針的操作。
原文:https://blog.csdn.net/leiyang2014/article/details/54174033?
?
總結
以上是生活随笔為你收集整理的MFC中STL容器中Vector,List,Map基本用法汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gdb使用实例
- 下一篇: 为什么你需要设计和维护一套自我移动标准?