国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++雜貨鋪】詳解list容器

這篇具有很好參考價(jià)值的文章主要介紹了【C++雜貨鋪】詳解list容器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

【C++雜貨鋪】詳解list容器,數(shù)據(jù)結(jié)構(gòu),C++雜貨鋪,c++,開發(fā)語言,學(xué)習(xí),STL,數(shù)據(jù)結(jié)構(gòu),list


目錄

??前言??

?? 介紹

?? 使用

??? 構(gòu)造

??? 迭代器iterator

??? capacity

??? modifiers

??? 迭代器失效

?? 模擬實(shí)現(xiàn)

??? 迭代器的實(shí)現(xiàn)

?? 代碼展示

?? 和vector的區(qū)別

?? 總結(jié)


??前言??

? ? ? ? 歡迎收看本期【C++雜貨鋪】,本期內(nèi)容將講解STL中關(guān)于list的內(nèi)容,會(huì)分為一下幾個(gè)方面進(jìn)行講解:第一,什么是list,和其他容器的比較;第二,list的常用接口的介紹;第三,從底層除法,模擬實(shí)現(xiàn)簡(jiǎn)易版list;最后,對(duì)比和vecotr的主要區(qū)別。

? ? ? ? 以上就是本期要講解的全部?jī)?nèi)容了,講解之前需要你有數(shù)據(jù)結(jié)構(gòu)中鏈表的儲(chǔ)備知識(shí),是為了更好的理解講解內(nèi)容。此外,模擬實(shí)現(xiàn)需要類和對(duì)象,模板等儲(chǔ)備知識(shí),如果只是想簡(jiǎn)單使用可以只看前兩章。

? ? ? ? 如果你還沒有類和對(duì)象及模板的知識(shí),可以閱覽下面這幾篇文章:【C++雜貨鋪】詳解類和對(duì)象 [上]-CSDN博客

【C++雜貨鋪】詳解類和對(duì)象 [中]-CSDN博客

【C++雜貨鋪】詳解類和對(duì)象 [下]-CSDN博客

【C++雜貨鋪】模板-CSDN博客

【C++雜貨鋪】詳解list容器,數(shù)據(jù)結(jié)構(gòu),C++雜貨鋪,c++,開發(fā)語言,學(xué)習(xí),STL,數(shù)據(jù)結(jié)構(gòu),list

?? 介紹

? ? ? ? list是可以在常熟范圍內(nèi)在任意位置進(jìn)行插入和刪除的序列式容器,并且該容器可以前后雙向迭代。

????????list底層是雙向鏈表結(jié)構(gòu),雙向鏈表中每個(gè)元素存儲(chǔ)在互不關(guān)聯(lián)的獨(dú)立節(jié)點(diǎn)中,在節(jié)點(diǎn)通過指針指向其前一個(gè)元素和后一個(gè)元素。

? ? ? ? 和其他的序列式容器相比(vector,array,deque),list通常在任意位置進(jìn)行插入,移動(dòng)元素的執(zhí)行效率更好。

? ? ? ? 與之相對(duì)的,list的最大缺陷是不支持在任意位置的隨機(jī)訪問。

【C++雜貨鋪】詳解list容器,數(shù)據(jù)結(jié)構(gòu),C++雜貨鋪,c++,開發(fā)語言,學(xué)習(xí),STL,數(shù)據(jù)結(jié)構(gòu),list

?? 使用

? ? ? ? list接口較多,這里簡(jiǎn)單介紹一些常用的重要接口。

? ? ? ? 下面是官方文檔的鏈接,對(duì)于容器的學(xué)習(xí)還是要多看文檔的。

????????list - C++ Reference (cplusplus.com)

??? 構(gòu)造

【C++雜貨鋪】詳解list容器,數(shù)據(jù)結(jié)構(gòu),C++雜貨鋪,c++,開發(fā)語言,學(xué)習(xí),STL,數(shù)據(jù)結(jié)構(gòu),list

??? 迭代器iterator

【C++雜貨鋪】詳解list容器,數(shù)據(jù)結(jié)構(gòu),C++雜貨鋪,c++,開發(fā)語言,學(xué)習(xí),STL,數(shù)據(jù)結(jié)構(gòu),list

??? capacity

【C++雜貨鋪】詳解list容器,數(shù)據(jù)結(jié)構(gòu),C++雜貨鋪,c++,開發(fā)語言,學(xué)習(xí),STL,數(shù)據(jù)結(jié)構(gòu),list【C++雜貨鋪】詳解list容器,數(shù)據(jù)結(jié)構(gòu),C++雜貨鋪,c++,開發(fā)語言,學(xué)習(xí),STL,數(shù)據(jù)結(jié)構(gòu),list

??? modifiers

【C++雜貨鋪】詳解list容器,數(shù)據(jù)結(jié)構(gòu),C++雜貨鋪,c++,開發(fā)語言,學(xué)習(xí),STL,數(shù)據(jù)結(jié)構(gòu),list

??? 迭代器失效

? ? ? ? 迭代器失效即迭代器所指向的節(jié)點(diǎn)無效,即該節(jié)點(diǎn)被刪除。因?yàn)?strong>list底層是帶頭結(jié)點(diǎn)的雙向循環(huán)鏈表,因此在list中進(jìn)行插入時(shí)是不會(huì)導(dǎo)致迭代器失效的,只有在刪除時(shí)才會(huì)失效,并且失效只是指向所刪除結(jié)點(diǎn)的迭代器,其他迭代器不會(huì)受到影響

void TestListIterator1()
{
 int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
 list<int> l(array, array+sizeof(array)/sizeof(array[0]));
 auto it = l.begin();
 while (it != l.end())
 {
 // erase()函數(shù)執(zhí)行后,it所指向的節(jié)點(diǎn)已被刪除,因此it無效,在下一次使用it時(shí),必須先給
其賦值
 l.erase(it); 
 ++it;
 }
}

// 改正
void TestListIterator()
{
 int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
 list<int> l(array, array+sizeof(array)/sizeof(array[0]));
 auto it = l.begin();
 while (it != l.end())
 {
 l.erase(it++); // it = l.erase(it);
 }
}

?? 模擬實(shí)現(xiàn)

? ? ? ? 對(duì)于list的模擬實(shí)現(xiàn)最難實(shí)現(xiàn)的就是迭代器的實(shí)現(xiàn)。所以下面將重點(diǎn)講解迭代器內(nèi)容。

??? 迭代器的實(shí)現(xiàn)

????????迭代器就是通過模擬指針,提供一種統(tǒng)一的方法來使用容器。

? ? ? ? 對(duì)于vecotr這樣的容器,迭代器可以直接是指針,但對(duì)于list這樣的容器,不能直接使用原生指針,因?yàn)榈讓觾?nèi)存地址不是連續(xù)的。

? ? ? ? 指針++,并不能實(shí)現(xiàn)node = node->next這樣的操作。這里就要用到C++的重要組成部分了,運(yùn)算符重載和實(shí)現(xiàn)了類。通過將指針封裝成類,來實(shí)現(xiàn)運(yùn)算符重載。

? ? ? ? 這里迭代器使用三個(gè)模板參數(shù),第一個(gè)表示數(shù)據(jù)data的類型,第二表示數(shù)據(jù)data的引用,第三個(gè)表示數(shù)據(jù)data的地址。

	template<class T,class Ref,class Ptr>
	struct ListIterator
	{
		typedef ListNode<T> Node;
		typedef ListIterator<T,Ref,Ptr> iterator;

		//構(gòu)造函數(shù)

		ListIterator(Node* node)
			:_node(node)
		{}

		Ref operator*()
		{
			return _node->data;
		}

		Ptr operator->()
		{
			return &_node->data;
		}

		//++it
		iterator&  operator++()
		{
			_node = _node->_next;
			return *this;
		}

		iterator operator++(int)
		{
			iterator temp(*this);
			_node = _node->_next;
			return temp;
		}

		//--it
		iterator& operator--()
		{
			_node = _node->_prev;
			return *this;
		}

		iterator operator--(int)
		{
			iterator temp(*this);
			_node = _node->_prev;
			return temp;
		}

		// != 
		bool operator!=(const iterator& it)
		{
			return _node != it._node;
		}

		bool operator==(const iterator & it)
		{
			return _node == it._node;
		}

		Node* _node;
	};

?? 代碼展示

? ? ? ? 下面將list的實(shí)現(xiàn),放在exercise命名空間中。

namespace exercise
{
	//節(jié)點(diǎn)類
	template<class T>
	struct ListNode
	{
		typedef ListNode<T> Node;
		Node* _next;
		Node* _prev;
		T data;

		ListNode(const T& val = T())
			:_next(nullptr)
			,_prev(nullptr)
			,data(val)
		{}


	};

	template<class T,class Ref,class Ptr>
	struct ListIterator
	{
		typedef ListNode<T> Node;
		typedef ListIterator<T,Ref,Ptr> iterator;

		//構(gòu)造函數(shù)

		ListIterator(Node* node)
			:_node(node)
		{}

		Ref operator*()
		{
			return _node->data;
		}

		Ptr operator->()
		{
			return &_node->data;
		}

		//++it
		iterator&  operator++()
		{
			_node = _node->_next;
			return *this;
		}

		iterator operator++(int)
		{
			iterator temp(*this);
			_node = _node->_next;
			return temp;
		}

		//--it
		iterator& operator--()
		{
			_node = _node->_prev;
			return *this;
		}

		iterator operator--(int)
		{
			iterator temp(*this);
			_node = _node->_prev;
			return temp;
		}

		// != 
		bool operator!=(const iterator& it)
		{
			return _node != it._node;
		}

		bool operator==(const iterator & it)
		{
			return _node == it._node;
		}

		Node* _node;
	};

	//list類
	template<class T>
	class list
	{
		typedef ListNode<T> Node;

	public:
		typedef ListIterator<T,T&,T*> iterator;
		typedef ListIterator<T,const T&,const T*> const_iterator;

		void empty_init()
		{
			_head = new Node;
			_head->_next = _head;
			_head->_prev = _head;
			_size = 0;
		}

		list()
		{
			empty_init();
		}

		list(const list<T>& l)
		{
			empty_init();
			for (auto& e : l)
			{
				push_back(e);
			}
		}

		void swap(list<T>& temp)
		{
			std::swap(_head,temp._head);
			std::swap(_size, temp._size);
		}

		list<T>& operator=(list<T> temp) 
		{
			swap(temp);
			return *this;
		}

		void clear()
		{
			iterator it = _head->_next;
			while (it != _head)
			{
				it = erase(it);
			}
		}

		~list()
		{
			clear();
			delete _head;
			_head = nullptr;
			_size = 0;
		}



		iterator begin()
		{
			return _head->_next;
		}

		iterator end()
		{
			return _head;
		}

		const_iterator begin() const
		{
			return _head->_next;
		}

		const_iterator end() const
		{
			return _head;
		}

		/*void push_back(const T& val)
		{
			Node* newnode = new Node(val);
			Node* tail = _head->_prev;
			newnode->_prev = tail;
			newnode->_next = _head;
			_head->_prev = newnode;
			tail->_next = newnode;
		}*/

		void push_back(const T& val)
		{
			insert(end(), val);
		}

		void insert(iterator pos, const T& val)
		{
			Node* newnode = new Node(val);
			Node* prev = pos._node->_prev;
			Node* next = pos._node;
			newnode->_prev = prev;
			prev->_next = newnode;
			newnode->_next = next;
			next->_prev = newnode;
			_size++;
		}

		iterator erase(iterator pos)
		{
			Node* prev = pos._node->_prev;
			Node* next = pos._node->_next;
			delete pos._node;
			prev->_next = next;
			next->_prev = prev;
			_size--;
			return next;
		}
		
		void pop_back()
		{
			erase(--end());
		}

		size_t size()
		{
			return _size;
		}


	private:
		Node* _head;
		size_t _size;
	};

}

?? 和vector的區(qū)別

【C++雜貨鋪】詳解list容器,數(shù)據(jù)結(jié)構(gòu),C++雜貨鋪,c++,開發(fā)語言,學(xué)習(xí),STL,數(shù)據(jù)結(jié)構(gòu),list

?? 總結(jié)

? ? ? ? 以上,就是本期【C++雜貨鋪】的主要內(nèi)容了,包含了list的介紹,list常用接口以及模擬實(shí)現(xiàn)list。

? ? ? ? 如果感覺本期內(nèi)容有幫助到你,歡迎點(diǎn)贊,收藏,關(guān)注Thanks?(?ω?)?

【C++雜貨鋪】詳解list容器,數(shù)據(jù)結(jié)構(gòu),C++雜貨鋪,c++,開發(fā)語言,學(xué)習(xí),STL,數(shù)據(jù)結(jié)構(gòu),list文章來源地址http://www.zghlxwxcb.cn/news/detail-851024.html

到了這里,關(guān)于【C++雜貨鋪】詳解list容器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C++雜貨鋪】模板

    【C++雜貨鋪】模板

    ?? 實(shí)現(xiàn)一個(gè)通用的交換函數(shù) 想要實(shí)現(xiàn)一個(gè)通用的交換函數(shù)不難,借助函數(shù)重載就可以。函數(shù)重載小伙伴們還記得嘛??,忘了的小伙伴可以走傳送門回去復(fù)習(xí)一下。如上面代碼所示,我們借助函數(shù)重載實(shí)現(xiàn)了三份 Swap 函數(shù),分別用來交換兩個(gè)整型變量、兩個(gè)雙精度浮點(diǎn)型變量

    2024年02月09日
    瀏覽(17)
  • 【C++雜貨鋪】?jī)?nèi)存管理

    【C++雜貨鋪】?jī)?nèi)存管理

    從用途和存儲(chǔ)的角度來看,在C/C++程序中有 局部數(shù)據(jù)、靜態(tài)數(shù)據(jù)、全局?jǐn)?shù)據(jù)、常量數(shù)據(jù)、動(dòng)態(tài)申請(qǐng)的數(shù)據(jù) 五種主要的數(shù)據(jù),各種數(shù)據(jù)的特點(diǎn)如下: 局部數(shù)據(jù) :隨用隨創(chuàng)建,存儲(chǔ)在棧區(qū),作用域只在局部,生命周期在局部,出了作用域就銷毀。 靜態(tài)數(shù)據(jù) :存儲(chǔ)在數(shù)據(jù)段,作

    2024年02月16日
    瀏覽(20)
  • 【C++雜貨鋪】?jī)?nèi)管管理

    【C++雜貨鋪】?jī)?nèi)管管理

    目錄 ??前言?? ?? C/C++中內(nèi)存分布 ?? new 和 delete的使用 ?? new 和 delete的優(yōu)點(diǎn) ?? new 和 delete的原理 ??? operator new 和 operator delete函數(shù) ??? 內(nèi)置類型 ??? 自定義類型 ?? 內(nèi)存泄漏 ?? 總結(jié) ? ? ? ? 歡迎收看本期【C++雜貨鋪】,本期內(nèi)容講解C++內(nèi)存管理。包含了C++中內(nèi)存

    2024年04月14日
    瀏覽(34)
  • 【C++雜貨鋪】拷貝構(gòu)造函數(shù)

    【C++雜貨鋪】拷貝構(gòu)造函數(shù)

    ?? 定義 拷貝構(gòu)造函數(shù) 是構(gòu)造函數(shù)的一個(gè)重載 ,它的本質(zhì)還是 構(gòu)造函數(shù) ,那就意味著,只有在創(chuàng)建對(duì)象的時(shí)候,編譯器才會(huì)自動(dòng)調(diào)用它,那他和普通的構(gòu)造函數(shù)有什么區(qū)別呢? 拷貝構(gòu)造函數(shù),是創(chuàng)建對(duì)象的時(shí)候,用一個(gè)已存在的對(duì)象,去初始化待創(chuàng)建的對(duì)象 。簡(jiǎn)單來說,

    2024年02月16日
    瀏覽(22)
  • 【C++雜貨鋪】缺省參數(shù)、函數(shù)重載

    【C++雜貨鋪】缺省參數(shù)、函數(shù)重載

    ?缺省參數(shù)是 聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)缺省值 。在調(diào)用該函數(shù)時(shí),如果沒有指定實(shí)參則采用該形參的缺省值,否則使用指定的實(shí)參。 ?上面代碼在 fun 函數(shù)的形參部分給了缺省值10,這意味著在調(diào)用 fun 函數(shù)的時(shí)候可以傳參,也可以不傳參,如果傳參了那形參

    2024年02月16日
    瀏覽(18)
  • 【C++雜貨鋪】運(yùn)算符重載

    【C++雜貨鋪】運(yùn)算符重載

    本文將以日期類為基礎(chǔ),去探尋運(yùn)算符重載的特性與使用方法,下面先給出日期類的基礎(chǔ)定義: 備注 :拷貝構(gòu)造函數(shù)和析構(gòu)函數(shù),均可以不寫,因?yàn)楫?dāng)前日期類的三個(gè)成員變量都是內(nèi)置類型,沒有動(dòng)態(tài)申請(qǐng)空間,使用淺拷貝就可以。 ?? 如何比較兩個(gè)日期的大?。?現(xiàn)如今,

    2024年02月16日
    瀏覽(22)
  • 【C++雜貨鋪】C++介紹、命名空間、輸入輸出

    【C++雜貨鋪】C++介紹、命名空間、輸入輸出

    ?C語言是 結(jié)構(gòu)化 和 模塊化 的語言,適合處理 較小規(guī)模 的程序。對(duì)于復(fù)雜的問題,規(guī)模較大的程序,需要高度的抽象和建模時(shí),C語言則不合適。為了解決軟件危機(jī),20世紀(jì)80年代,計(jì)算機(jī)界提出了 OOP (object oriented programming: 面向?qū)ο?)思想,支持面向?qū)ο蟮某绦蛟O(shè)計(jì)語言應(yīng)

    2024年02月16日
    瀏覽(31)
  • 【C++雜貨鋪】再談?lì)惡蛯?duì)象

    【C++雜貨鋪】再談?lì)惡蛯?duì)象

    在創(chuàng)建對(duì)象的時(shí)候,編譯器通過調(diào)用構(gòu)造函數(shù),在構(gòu)造函數(shù)體中,給對(duì)象中的各個(gè)成員變量一個(gè)合適的初值。 雖然上述構(gòu)造函數(shù)調(diào)用之后,對(duì)象中已經(jīng)有了一個(gè)初始值,但是不能將其稱為對(duì)對(duì)象中成員變量的初始化, 構(gòu)造函數(shù)體中的語句只能將其稱為賦初值,而不能稱作初

    2024年02月16日
    瀏覽(15)
  • 【C++雜貨鋪】初識(shí)類和對(duì)象

    【C++雜貨鋪】初識(shí)類和對(duì)象

    ?? 面向過程 C語言是 面向過程的 ,關(guān)注的是過程,分析出求解問題的步驟,通過函數(shù)調(diào)用逐步解決問題。以洗衣服這件事為例,下圖是C語言完成洗衣服這件事的過程。 ?? 面向?qū)ο?C++是 基于面向?qū)ο蟮?,關(guān)注的是對(duì)象,將一件事情拆分成不同的對(duì)象,靠對(duì)象之間的交互完

    2024年02月16日
    瀏覽(23)
  • 【C++雜貨鋪】string使用指南

    【C++雜貨鋪】string使用指南

    2024年02月14日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包