0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

c++之list容器

嵌入式技術 ? 來源:嵌入式技術 ? 作者:嵌入式技術 ? 2023-07-15 08:53 ? 次閱讀

1.list容器簡介

list是序列容器,允許在序列中的任何位置執(zhí)行固定O(1)時間復雜度的插入和刪除操作,并在兩個方向進行迭代。list容器是一個雙向循環(huán)鏈表。

  • list容器與vector容器區(qū)別:

list中空間是隨機的,通過指向域保存下一個成員地址;vector容器空間是連續(xù)的;

list容器數(shù)據(jù)插入和刪除方便,能合理的利用空間;vector容器則是沒法實時分配資源;

wKgaomSxP96ASzZmAAfWkse885c857.png

2.list容器構造函數(shù)

list容器構造函數(shù):
	list p;//默認構造
	list(begin,end);//區(qū)間賦值
	list(int num,elem);//num個elem值
	list(const list &p);//拷貝構造
	取頭數(shù)據(jù):front()
	取尾數(shù)據(jù):back();
	互換成員swap();

使用示例:

#include 
using namespace std;
#include 
/*遍歷*/
void PrintList(const list& p, int flag)
{
	if (flag == 1)//正向遍歷
	{
		cout ::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
		{
			cout ::const_reverse_iterator ptr = p.rbegin(); ptr != p.rend(); ptr++)
		{
			cout  lst;//默認構造
	//尾插法
	lst.push_back(100);
	lst.push_back(200);
	//頭插法
	lst.push_front(300);
	lst.push_front(400);
	PrintList(lst, 1);
	PrintList(lst, 0);
	list lst2(lst.begin(), lst.end());//區(qū)間賦值
	cout  lst3(3, 666);//3個666
	PrintList(lst3, 1);
	list lst4(lst2);//拷貝構造
}
int main()
{
	test();
	system("pause");
}
wKgaomSxQFCAZY4_AAPWBdLGxEs306.png

3.list容器賦值與互換成員

list容器賦值:
	重載運算符=: list& operator=(const list &p);
	siggn(int num,elem);//num個elem
	siggn(begin,end);//區(qū)間賦值
互換:
	swap(list &p);

使用示例:

#include 
using namespace std;
#include 
void PrintList(const list& p)
{
	for (list::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout  lst;
	for (int i = 10; i <= 30; i += 10)
	{
		lst.push_back(i);
	}
	list lst2 = lst;//直接賦值
	cout  lst3;
	lst3.assign(5, 666);
	cout  lst4;
	lst4.assign(lst3.begin(), lst3.end());//區(qū)間賦值
	cout 
wKgaomSxQL-AQFzcAAOAoFyWHDU802.png

4.list容器設置和獲取大小

list容器也有獲取元素個數(shù)函數(shù)size()和設置元素個數(shù)函數(shù)resize(),但list容器不存在獲取容量capacity()。

檢查容器是否為空可以使用empty()函數(shù)。

list容器元素個數(shù):size()
指定元素個數(shù):resize(int num);
			 resize(int num,elem); 指定大小,超出用elem補齊
判斷容器是否為空:empty()

使用示例:

#include 
using namespace std;
#include 
void PrintList(const list& p)
{
	for (list::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout  lst;
	//插入數(shù)據(jù)
	lst.push_back("C++");
	lst.push_back("list容器");
	lst.push_back("學習");
	lst.push_back("示例");
	PrintList(lst);
	cout  lst2;
	if (lst2.empty())
	{
		cout 
wKgaomSxQaWAJF7GAAQXx5Zj4nc287.png

5.list容器插入與刪除

list容器中插入與刪除相關函數(shù)如下所示:


list插入:
	push_back();尾插
	push_front();//頭插入
	insert(iterator pos,elem);//在指定位置插入elem
	insert(iterator pos,n,elem);//在指定位置插入n個elem
	insert(iterator pos,begin,endl);在指定位置插入一個區(qū)間
list刪除:
	pop_back();//尾刪
	pop_front();//頭刪除
	erase(iterator pos);//刪除指定位置的內(nèi)容
	erase(begin,end);//刪除區(qū)間內(nèi)容
	clear();//刪除所有內(nèi)容
	remov(elem);刪除容器中所有的elem

使用示例:

#include 
using namespace std;
#include 
class Person
{
public:
	Person(string name, int age) :name(name), age(age) {

	}
	bool operator==(const Person &p);
	string name;
	int age;
};
ostream& operatorage == p.age && this->name == p.name)return true;
	return false;
}
void PrintList(list& p)
{
	for (list::iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout  lst;
	lst.push_back(p1);
	lst.push_back(p2);
	lst.push_back(p3);
	lst.push_back(p4);
	lst.push_back(p5);
	if (p1 == p1)
	{
		cout ::iterator ptr = lst.begin();
	ptr++;
	lst.insert(ptr, Person("it_阿水", 18));//從第一個位置插入數(shù)據(jù)
	cout  lst2;
	lst2.insert(lst2.begin(),lst.begin(), lst.end());//從頭插入?yún)^(qū)間數(shù)據(jù)
	cout lst3;
	lst3.push_back(10);
	lst3.push_back(10);
	lst3.push_back(3);
	lst3.push_back(10);
	lst3.push_back(3);
	lst3.remove(10);//刪除所以的10
	for (list::iterator ptr = lst3.begin(); ptr != lst3.end(); ptr++)
	{
		cout 
wKgZomSxQjyAXjdJAAbRGGiR5fQ808.png

6.list容器數(shù)據(jù)存取

由于list容器底層是通過雙向循環(huán)鏈表來實現(xiàn)的,成員空間都是通過指針域保存的,所以不支持[]和at()訪問成員。

list容器的迭代器不支持隨機訪問。


list容器數(shù)據(jù)存取:
	back();//獲取最后一個元素
	push_back();//從末尾插入
	front();//獲取第一個元素
	push_front();從頭插入
注意:由于list容器并不是一段連續(xù)的空間,所以不支持[]和at()訪問成員
	  list容器的迭代器不支持隨機訪問,但是雙向的

使用示例:

#include 
using namespace std;
#include 
void test()
{ 
	list lst;
	//插入數(shù)據(jù)
	lst.push_back(10);
	lst.push_front(20);
	lst.push_back(30);
	cout ::iterator ptr = lst.begin();
	ptr++;//支持往后
	ptr--;//支持往前
	//ptr += 3;錯誤,不支持隨機訪問

}
int main()
{
	test();
	system("pause");
}
wKgaomSxQziAGWOOAAL38P_I8RE723.png

7.list容器數(shù)據(jù)反轉(zhuǎn)與排序

list容器自帶排序函數(shù)sort(),默認是升序排序。


list容器反轉(zhuǎn):
	reverse();//反轉(zhuǎn)(逆序)
list容器排序
	sort();//成員函數(shù)
注意:所有不支持迭代器隨機訪問的容器都不能使用全局函數(shù)sort進行排序,一般該容器會自帶排序的成員函數(shù)

使用示例:


#include 
using namespace std;
#include 
void PrintList(list& p)
{
	for (list::iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout  v2;
}
void test()
{
	list lst;
	lst.push_back(10);
	lst.push_back(30);
	lst.push_back(20);
	lst.push_front(40);
	lst.push_front(60);
	lst.push_front(50);
	PrintList(lst);
	//反轉(zhuǎn)
	lst.reverse();
	cout 
wKgZomSxRL2AW1_ZAAPpWb-KwFU685.png

8.list容器自定義數(shù)據(jù)類型排序案例

Person數(shù)據(jù)保存每個用戶的姓名、年齡、身高,現(xiàn)在需要對年齡按升序排序,若年齡相同,則對按身高進行降序排序。

#include 
using namespace std;
#include 
class Person
{
public:
	Person(string name, int age, int height) :name(name), age(age), height(height) {
	}
	string name;//姓名
	int  age;//年齡
	int height;//身高
};
ostream& operator& p)
{
	for (list::iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout  p2.height;
	}
	return p1.age < p2.age;
}
void test()
{
	list lst;
	lst.push_back(Person("小王", 18, 170));
	lst.push_back(Person("小劉", 18, 175));
	lst.push_back(Person("小李", 23, 168));
	lst.push_back(Person("小林", 20, 171));
	lst.push_back(Person("小蔣", 18, 172));
	lst.push_back(Person("小姜", 17, 176));
	PrintList(lst);
	cout 
wKgaomSxRY2AR9s-AAWCZ2kW4yM283.png
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關注

    關注

    3

    文章

    4331

    瀏覽量

    62609
  • 容器
    +關注

    關注

    0

    文章

    495

    瀏覽量

    22061
  • C++
    C++
    +關注

    關注

    22

    文章

    2108

    瀏覽量

    73646
收藏 人收藏

    評論

    相關推薦

    c++vector容器

    1.vector容器介紹 ? ? ? 向量(Vector)是一個封裝了動態(tài)大小數(shù)組的順序容器(Sequence Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對象??梢院唵蔚恼J為
    的頭像 發(fā)表于 07-13 19:36 ?1431次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>之</b>vector<b class='flag-5'>容器</b>

    C++STL算法(二)

    C++STL算法(二)
    的頭像 發(fā)表于 07-18 14:49 ?1051次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>STL算法(二)

    c++STL算法(三)

    c++STL算法(三)
    的頭像 發(fā)表于 07-18 15:00 ?1294次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>之</b>STL算法(三)

    C++文件操作

    C++文件操作
    的頭像 發(fā)表于 07-21 10:52 ?1115次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>文件操作

    C++力扣刷題記盛最多的水容器,讓我們從C++做題到放棄

    C++
    電路設計
    發(fā)布于 :2023年01月05日 15:49:23

    C++零基礎教程STL容器initializer_list,輕松上手C++STL

    編程語言C++語言
    電子學習
    發(fā)布于 :2023年01月14日 11:30:27

    詳細剖析C++的的3種容器

    容器是隨著面向?qū)ο笳Z言的誕生而提出的,容器類在面向?qū)ο笳Z言中特別重要,甚至它被認為是早期面向?qū)ο笳Z言的基礎。在現(xiàn)在幾乎所有的面向?qū)ο蟮恼Z言中也都伴隨著一個容器集,在C++ 中,就是標準
    的頭像 發(fā)表于 01-09 12:57 ?4964次閱讀
    詳細剖析<b class='flag-5'>C++</b>的的3種<b class='flag-5'>容器</b>

    C++容器的使用代碼資料總結(jié)免費下載

    本文檔的主要內(nèi)容詳細介紹的是C++容器的使用代碼資料總結(jié)免費下載。
    發(fā)表于 01-29 10:52 ?3次下載
    <b class='flag-5'>C++</b><b class='flag-5'>容器</b>的使用代碼資料總結(jié)免費下載

    C++設計新思維-泛型編程與設計應用

    C++設計新思維-泛型編程與設計應用
    發(fā)表于 11-16 15:59 ?3次下載

    什么是list

    list 容器,又稱雙向鏈表容器,即該容器的底層是以雙向鏈表的形式實現(xiàn)的。這意味著,list 容器
    的頭像 發(fā)表于 02-27 15:52 ?2389次閱讀

    C++學習筆記c++的基本認識

    自這篇文章我們即將開始C++的奇幻之旅,其內(nèi)容主要是讀C++ Primer的總結(jié)和筆記,有興趣可以找原版書看看,對于學習C++還是有很大幫助的。這篇文章將從一個經(jīng)典的程序開始介紹C++
    的頭像 發(fā)表于 03-17 13:57 ?737次閱讀

    C/C++函數(shù)體hack(下)

    首先來說下 什么是hack ? hack字面意思“ 非法入侵 ”,那么在C/C++中其實就是 使用反匯編查看C/C++代碼對應的匯編代碼 。 那可能有人要問了,
    的頭像 發(fā)表于 03-30 16:53 ?1223次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>之</b>函數(shù)體hack(下)

    C++學習筆記順序容器

    C++中的順序容器是一種用于存儲和管理元素序列的數(shù)據(jù)結(jié)構。它們提供了一組有序的元素,并支持在序列的任意位置插入和刪除元素。C++標準庫中提供了多種順序容器,包括vector、deque
    的頭像 發(fā)表于 05-11 17:05 ?596次閱讀

    C++入門通用算法

    C++ 是一種強大的編程語言,它提供了許多通用算法,可以用于各種容器類型。這些算法是通過迭代器來操作容器中的元素,因此它們是通用的,可以用于不同類型的容器。在本篇博客中,我們將詳細介紹
    的頭像 發(fā)表于 05-17 09:40 ?670次閱讀

    C++之父新作帶你勾勒現(xiàn)代C++地圖

    為了幫助大家解決這些痛點問題,讓大家領略現(xiàn)代C++美,掌握其中的精髓,更好地使用C++,C++之父Bjarne Stroustrup坐不住了,他親自操刀寫就了這本《
    的頭像 發(fā)表于 10-30 16:35 ?853次閱讀
    <b class='flag-5'>C++</b>之父新作帶你勾勒現(xiàn)代<b class='flag-5'>C++</b>地圖