C++ STL map的使用

1、map簡介

map是一類關聯式容器。它的特點是增加和刪除節點對迭代器的影響很小,除了那個操作節點,對其他的節點都沒有什么影響。對于迭代器來說,可以修改實值,而不能修改key。

2、map的功能

  1. 自動建立Key - value的對應。key 和 value可以是任意你需要的類型。
  2. 根據key值快速查找記錄,查找的復雜度基本是Log(N),如果有1000個記錄,最多查找10次,1,000,000個記錄,最多查找20次。
  3. 快速插入Key - Value 記錄。
  4. 快速刪除記錄
  5. 根據Key 修改value記錄。
  6. 遍歷所有記錄。

3、使用map

使用map得包含map類所在的頭文件

#include <map> //注意,STL頭文件沒有擴展名.h

map對象是模板類,需要關鍵字和存儲對象兩個模板參數:

std:map<int, string> personnel;

這樣就定義了一個用int作為索引,并擁有相關聯的指向string的指針.

為了使用方便,可以對模板類進行一下類型定義,

typedef map<int, CString> UDT_MAP_INT_CSTRING;

UDT_MAP_INT_CSTRING enumMap;

4、在map中插入元素

改變map中的條目非常簡單,因為map類已經對[]操作符進行了重載

enumMap[1] = "One";

enumMap[2] = "Two";

.....

這樣非常直觀,但存在一個性能的問題。插入2時,先在enumMap中查找主鍵為2的項,沒發現,然后將一個新的對象插入enumMap,鍵是2,值是一個空字符串,插入完成后,將字符串賦為"Two"; 該方法會將每個值都賦為缺省值,然后再賦為顯示的值,如果元素是類對象,則開銷比較大。我們可以用以下方法來避免開銷:

enumMap.insert(map<int, CString> :: value_type(2, "Two"))

5、查找并獲取map中的元素

下標操作符給出了獲得一個值的最簡單方法:

CString tmp = enumMap[2];

但是,只有當map中有這個鍵的實例時才對,否則會自動插入一個實例,值為初始化值。

我們可以使用Find()和Count()方法來發現一個鍵是否存在。

查找map中是否包含某個關鍵字條目用find()方法,傳入的參數是要查找的key,在這里需要提到的是begin()和end()兩個成員,分別代表map對象中第一個條目和最后一個條目,這兩個數據的類型是iterator.

int nFindKey = 2; //要查找的Key

//定義一個條目變量(實際是指針)

UDT_MAP_INT_CSTRING::iterator it= enumMap.find(nFindKey);

if(it == enumMap.end()) {

//沒找到

}

else {

//找到

}

通過map對象的方法獲取的iterator數據類型是一個std::pair對象,包括兩個數據 iterator->first 和 iterator->second 分別代表關鍵字和存儲的數據

6、從map中刪除元素

移除某個map中某個條目用erase()

該成員方法的定義如下

  1. iterator erase(iterator it); //通過一個條目對象刪除
  2. iterator erase(iterator first, iterator last); //刪除一個范圍
  3. size_type erase(const Key& key); //通過關鍵字刪除

clear()就相當于 enumMap.erase(enumMap.begin(), enumMap.end());

C++ STL map的使用

以下是對C++中STL map的插入,查找,遍歷及刪除的例子:

#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;

//insert element
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;

//find element
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;
}

//see element
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;

//delete element
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;
}

轉載于:https://www.cnblogs.com/songQQ/archive/2010/01/24/1655473.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379410.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379410.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379410.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

bfs廣度優先搜索算法_圖的廣度優先搜索(BFS)

bfs廣度優先搜索算法What you will learn? 您將學到什么&#xff1f; How to implement Breath first search of a graph? 如何實現圖的呼吸優先搜索&#xff1f; Breadth First Search is a level-wise vertex traversal process. Like a tree all the graphs have verte…

考研C++必刷題(一)

【程序1】 題目&#xff1a;有1、2、3、4個數字&#xff0c;能組成多少個互不相同且無重復數字的三位數&#xff1f;都是多少&#xff1f; 解題思路&#xff1a; 利用三層循環&#xff0c;分別控制百位十位個位&#xff0c;若百位十位個位有重復的&#xff0c;則不輸出即可。 代…

關于計算機存儲單位?

關于計算機存儲單位&#xff1f; 計算機只能識別二進制。(1010100110. . . ) 1字節 8bit&#xff08;8比特&#xff09;–>1byte 8bit 1bit 就是一個 1 或 0 1KB 1024byte byte是[-128 ~ 127]&#xff0c;共可以標識256個不同的數字。 byte類型的最大值是怎么計算出來的…

ffmpeg 命令轉封裝

1&#xff1a; 改變編碼格式 原mp4文件:視頻是h264 音頻是aac 視頻轉成h265&#xff0c;音頻轉成mp3&#xff08;容器為mkv&#xff0c;有些容器不一定支持放h265的&#xff09; ffmpeg -i test_60s.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv 播放&#xff1a…

Delphi 2010 DataSnap封裝COM對象

在Delphi 2010中,DataSnap已完全可以不使用COM了.想起在windows上配置COM,就麻煩的很,如果在本機還好說,在遠程要涉及到權限等諸多問題(用SocketConnection要方便一些). 如果早期寫的程序中有許多COM對象,我們可以通過DataSnap的封裝,使用適配器模式簡單地封裝一下,那么在客戶端…

JavaScript中帶有示例的Math.PI屬性

JavaScript | Math.PI屬性 (JavaScript | Math.PI Property) Math.PI is a property in math library of JavaScript that is used to find the value of PI(π) which is a mathematical constant whose value is 3.141. It is generally used to solve problems related to c…

設計模式筆記——Bridge

橋接模式Bridge Pattern 組合關系&#xff08;實心菱形&#xff09;&#xff1a;強的擁有關系&#xff0c;體現了嚴格的整體和部分的關系&#xff0c;部分和整體的生命周期相同。 聚合關系&#xff08;空心菱形&#xff09;&#xff1a;弱的擁有關系&#xff0c;A對象可以包含B…

實驗7 視圖操作

實驗7 視圖操作一、實驗目的 1.了解視圖的功能。 2.掌握創建和查看視圖的方法。 3.掌握視圖修改和刪除視圖的方法。 二、實驗要求 創建student數據庫中的相關視圖。 三、實驗步驟 1.在members表中創建地址為“湖南株洲”的會員的視圖V_addr&#xff0c;SQL代碼如下所示&#x…

從日志服務器接收的對 metaWeblog.newPost 方法的響應無效的解決方案

今天用windows Live Writer(WLW)寫博客出現了“從日志服務器接收的對 metaWeblog.newPost 方法的響應無效”的故障。之前用的還好好的。于是我祭起google大法。從網上搜索了不少資料都是關于WP&#xff0c;沒有關于z-blog。這些文章提到可能的問題是諸如插件沖突、utf編碼之類的…

匯編語言-006(數組操作 、字符串應用、PUSHFD_POPFD 、PUSHAD_POPAD 、 子程序 函數、 USES 、 INC_DEC )

1: 計算斐波那契數列前7個數值之和 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data.code main PROCmov esi,1mov edi,1mov eax,2mov ecx,5 L1: mov ebx,esiadd ebx,edimov esi,edimov edi,ebxadd eax,ebxloop L1INVOKE ExitProcess,0 main END…

弗林的計算機體系結構分類

計算機體系結構分類 (Classification of computer architecture) According to Flynns there are four different classification of computer architecture, 根據弗林的說法&#xff0c;計算機體系結構有四種不同的分類&#xff0c; 1)SISD(單指令單數據流) (1) SISD (Single…

讀入txt

用C#讀取txt文件的方法1、使用FileStream讀寫文件 文件頭&#xff1a; using System;using System.Collections.Generic;using System.Text;using System.IO; 讀文件核心代碼&#xff1a; byte[] byData new byte[100];char[] charData new char[1000]; try{FileStream sFile…

實驗6 數據查詢--高級查詢

實驗6 數據查詢--高級查詢一、實驗目的 1.掌握查詢結果排序的方法。 2.掌握排序結果進行計算的方法。 3.掌握排序結果分組的方法。 4.掌握排序結果分組后再選擇的方法。 二、實驗要求 應用SELECT語句對數據庫eshop中數據進行指定條件的高級查詢。 三、實驗步驟 1.查詢性別為“…

Python程序可打印今天的年,月和日

In the below example – we are implementing a python program to print the current/ todays year, month and year. 在下面的示例中-我們正在實現一個python程序來打印當前/今天的年&#xff0c;月和年 。 Steps: 腳步&#xff1a; Import the date class from datetime …

工資年結時提示“上年數據已經結轉”

解決方案&#xff1a;執行如下SQL語句即可解決&#xff1a;use ufsystem update ua_account_sub set bclosing0 where cacc_id001 and iyear2005 and csub_idwa 重新年結即可 問題分析&#xff1a;產生問題的原因是用戶進行過工資的年結&#xff0c;在業務數據需要調整&…

匯編語言-007(ADD_SUB_NEG 、 PUSH和POP指令應用 、 AND,OR,XOR使用 、 條件跳轉應用)

1&#xff1a; ADD_SUB_NEG : ADD偽指令增加數值&#xff0c;SUB偽指令減少數值,NEG取反1 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data var1 DWORD 10000h var2 DWORD 20000h.code main PROCmov eax,var1add eax,var2mov eax,var2sub eax,v…

Automatic Reference Counting

Automatic Reference Counting http://clang.llvm.org/docs/AutomaticReferenceCounting.html轉載于:https://www.cnblogs.com/StarMud/articles/2642263.html

實驗5 數據查詢--連接查詢

實驗5 數據查詢--連接查詢一、實驗目的 1.熟悉等值聯接查詢的方法。 2.熟悉非等值聯接查詢的方法。 3.熟悉自身聯接查詢的方法。 4.熟悉外聯接查詢的方法。 5.熟悉復合條件聯接的方法。 二、實驗要求 應用SELECT語句對數據庫eshop中數據進行指定條件的連接查詢。 三、實驗步驟…

Java RandomAccessFile readInt()方法與示例

RandomAccessFile類readInt()方法 (RandomAccessFile Class readInt() method) readInt() method is available in java.io package. readInt()方法在java.io包中可用。 readInt() method is used to read signed 32-bit integer value from this RandomAccessFile. readInt()方…

天高地厚(轉)

信樂團-天高地厚作詞:武雄作曲:詹凌駕 keith stuart你累了沒有可否伸出雙手想擁抱怎能握著拳頭我們還有很多夢沒做還有很多明天要走要讓世界聽見我們的歌準備好沒有時間不再回頭想要飛不必任何理由不管世界盡頭多寂寞你的身邊一定有我我們說過不管天高地厚想飛到那最高最遠最灑…