1. 程式人生 > >資料結構::關於STL中map,set,muliset,multimap要說的

資料結構::關於STL中map,set,muliset,multimap要說的

前言

1、對於關聯式容器,在插入和刪除的時候是不需要記憶體拷貝可記憶體移動的,所有的元素
都是用節點的方式進行存取,所以在這裡插入和刪除都是指標的移動,而不會發生記憶體
移動,因此在進行插入操作的時候是不會發生迭代器失效的問題的。


相對於vector來說,每一次刪除和插入,指標都有可能失效,呼叫push_back在尾部插入也是如此。因為為了保證內部資料的連續存放,iterator指向的那塊記憶體在刪除和插入過程中可能已經被其他記憶體覆蓋或者記憶體已經被釋放了。即使時push_back的時候,容器內部空間可能不夠,需要一塊新的更大的記憶體,只有把以前的記憶體釋放,申請新的更大的記憶體,複製已有的資料元素到新的記憶體,最後把需要插入的元素放到最後,那麼以前的記憶體指標自然就不可用了。特別時在和find等演算法在一起使用的時候,牢記這個原則:不要使用過期的iterator。


2、map<int, int, less<int>, Alloc<int> > intmap;

這時候在intmap中使用的allocator並不是Alloc<int>, 而是通過了轉換的Alloc,具體轉換的方法時在內部通過Alloc<int>::rebind重新定義了新的節點分配器,詳細的實現參看徹底學習STL中的Allocator。其實你就記住一點,在map和set內面的分配器已經發生了變化,reserve方法你就不要奢望了。

3、STL中以空間配置器來分配這些記憶體,以記憶體池來進行管理這些記憶體,大大減少了記憶體碎片,提高了系統的效能。

底層詳述:

1、set的底層實現:

1)迭代器是被定義成const iterator的,說明set的鍵值是不允許更改的
2)set使用的是insert_unique,而不是insert_equal,因為set是不允許相同的鍵值存在的
3)使用STL演算法find進行查詢可以,但是不是很好的辦法,可以直接用STL的find來進行搜尋,效率會更好,因為是循序搜尋
4)不允許通過迭代器進行修改set裡面的值


2、map的底層實現
1)所有元素都是pair,pair有連個成員:first和second;
2)我們不可以通過map的迭代器來進行元素的修改,因為map的鍵值關係到它的排列規則,如果
修改的話,就將這種規則破壞了。但是我們可以修改實值的值,因為實值與其排列無關
eg:it->second = 5;可以進行修改value的值
3)也是通過紅黑樹進行實現的
4)map的迭代器不是const 型別的,因為它允許進行修改鍵值
5)它的底層也是insert_unique,
6)關於過載的下標的使用:使用其鍵值查詢它的實值
   返回第一個鍵值對應的實值的引用


3、nultiset,multimap
1)允許鍵值重複
2)採用的是紅黑樹的insert_equal機制














相關推薦

資料結構::關於STLmap,set,muliset,multimap要說的

前言: 1、對於關聯式容器,在插入和刪除的時候是不需要記憶體拷貝可記憶體移動的,所有的元素 都是用節點的方式進行存取,所以在這裡插入和刪除都是指標的移動,而不會發生記憶體 移動,因此在進行插入操作的時

STLmapset資料結構及底層實現

本文分析了STL的map和set vector(向量)——STL中標準而安全的陣列。只能在vector 的“前面”增加資料。 deque(雙端佇列double-ended queue)——在功能上和vector相似,但是可以在前後兩端向其中新增資料。  list(列表)——遊標

Java核心資料結構(List、MapSet)原理與使用技巧

JDK提供了一組主要的資料結構實現,如List、Map、Set等常用資料結構。這些資料都繼承自java.util.Collection介面,並位於java.util包內。 一、List介面 最重要的三種List介面實現:ArrayList、Vector、LinkedList。它們的類圖如

STLmapset

C++11才開始支援括號初始化!!! 關於STL中的map和set 首先來看一下關聯容器吧 關聯容器迭代器:map的value_type是pair<const key_type, mapped_type>,所以map迭代器只能改變關鍵字對映的值(mapped_type),不能

STL mapset 的知識點總結

STL中的容器有順序容器 (vector,list,deque),關聯容器(map,set)還有一些其他容器。 根據不同的場合選擇不同的容器,會有意想不到的收穫。 Map是單詞mapping(對映)的縮寫 Set是單詞set(集合)的意思; Map和set內部的元素不可以重

STLmapmultimap,hashmap的區別。

stl中的map就是為了方便查詢和定位。 下面先看看 list存資料和查詢的情況。 1.使用list儲存資料。 list是線性表,佔用的是線性不連續的內容空間。  每個元素只與 它前面/它後面的元素 指向關係。也就是說,你拿到一個元素後,可以找到他的上一個元素或者下一個。

java 幾種常用資料結構 collection與map

JAVA中常用的資料結構(java.util. 中) Java中有幾種常用的資料結構,主要分為Collection和map兩個主要介面(介面只提供方法,並不提供實現),而程式中最終使用的資料結構是繼承自這些介面的資料結構類。其主要的關係(繼承關係)有:  (----詳

STLSetMap

STL中的Set和Map 先來看一段網路上的文字描述: 上圖是一段關於STL中Set集合的描述,同樣的,也近似適合Map的描述。上述文字中,描述了最為重要的特徵: Set和Map,底層呼叫了紅黑樹的結構,並且實現的是一種自動平衡二叉搜尋樹。 Set 平衡二叉搜尋樹(Set) 如上圖,S

第一次用STLset

根據 class 兩個 print 整數 而且 -- 關聯 輸入 給你兩個集合,要求{A} + {B}. 註:同一個集合中不會有兩個相同的元素. Input每組輸入數據分為三行,第一行有兩個數字n,m(0<n,m<=10000),分別表示集合A和集合B的元素個

C++ STLmap和unordered_map的區別

map與unordered_map對比 map unordered_map 紅黑樹(屬於非嚴格二叉平衡搜尋樹)實現 雜湊表實現 有序 無序 —— 查詢時間複雜度為O(1

資料結構序遍歷與後序遍歷構造二叉樹

根據一棵樹的中序遍歷與後序遍歷構造二叉樹。 具體程式碼如下: struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNod

go語言基礎資料結構學習 ---- 字典(map)

go語言基礎資料結構學習–> 字典(map) go 語言中的字典和python 中的字典特性差不多 相同: 鍵值對, 無序集合, 每個鍵都是唯一的, 對一個鍵多次賦值會更新當前鍵的值; 不同: go語言的字典裡面的型別是定好的, 不可變更, python可以隨

資料結構——由序與後序遍歷確定的二叉樹

由中序與後序遍歷確定的二叉樹 #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXSIZE 50 typedef struct Node{ //二叉樹

(轉)C++ STLmap.erase(it++)用法原理解析

之前在程式碼中使用map::erase函式時,誤搬了vector::erase的用法,導致Server down掉了,好在在測試環境就及時發現了問題,在上線前進行了補救==。  以下總結一下map::erase的正確用法。  首先看一下在迴圈中使用vector::eras

資料結構----Java陣列的排序

快速排序:時間複雜度O(nlogn),不穩定的排序演算法 原理:快速排序是一種交換排序,它的基本思想是:通過一趟排序將待排序的記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,

資料結構----Java陣列的查詢

線性查詢:時間複雜度O(n);適合於儲存結構為順序儲存或連結儲存的線性表。 原理:順序查詢也稱為線形查詢,屬於無序查詢演算法。從資料結構線形表的一端開始,順序掃描,依次將掃描到的結點關鍵字與給定值k相

資料結構stl

  排序sort bool cmp(int x1, int x2) { return x1 < x2; } sort(a,a + 100, cmp) 棧 stack #include <stack> using namespace std;

關於資料結構演算法的比較排序(一)(附Java程式碼實現)

     現在已經是10月份,秋招正在進行,不知道是不是有的人會和我一樣正在瘋狂的複習起資料結構,在這裡我將就常見的幾種比較排序做一些簡單的解析,同時附上具體的程式碼實現。 1.氣泡排序 氣泡排序通常是我們最先接觸道的比較排序的一種,具體排序步驟如下: 1.比較相鄰的元

Java資料結構根次序遍歷二叉排序樹

        昨天離開了創新創業基地,有點難受,雖然換來了高效,但是總覺的難受,一起度過了半年,昨天離開了。 說正事,今天更新二叉排序樹的中根遍歷。         思想:其實沒啥,類似與二叉樹的非遞迴中

STLmap用法詳解

Map是STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的資料處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。這裡說下map內部資料的組織,map內部自建一顆