C++STL中map的底层实现和使用

STL其他内容解析:关于C++中STL的理解和应用


作用:

std map是STL的一个关联容器,map中的元素是关键字----值的对(key--value):关键字起到索引的作用,值则表示与索引相关联的数据。每个关键字只能在map中出现一次。STL的map底层是用红黑树实现的,查找时间复杂度是log(n);

常用函数:

     begin()         返回指向map头部的迭代器
     clear()        删除所有元素
     count()         返回指定元素出现的次数
     empty()         如果map为空则返回true
     end()           返回指向map末尾的迭代器
     equal_range()   返回特殊条目的迭代器对
     erase()         删除一个元素,参数可以是迭代器,可以是关键字
     find()          查找一个元素,返回迭代器
     get_allocator() 返回map的配置器
     insert()        插入元素,插入pair
     key_comp()      返回比较元素key的函数
     lower_bound()   返回键值>=给定元素的第一个位置
     max_size()      返回可以容纳的最大元素个数
     rbegin()        返回一个指向map尾部的逆向迭代器
     rend()          返回一个指向map头部的逆向迭代器
     size()          返回map中元素的个数
     swap()           交换两个map
     upper_bound()    返回键值>给定元素的第一个位置
     value_comp()     返回比较元素value的函数

代码示例:

#include<iostream>
#include<string>
#include<map>

using namespace std;

int main(){  
    map<string,int> s;   //map定义 
    map<string,int>::iterator it;   //迭代器 
     
    //插入元素的三种方法 
    s.insert(make_pair("Amey",99));
    s.insert(pair<string,int>("Maroon",100));
    s["Tom"]=88;
    
    //查找的两种方法 count和find 
    cout<<s.count("Tom")<<endl;  
    it=s.find("Thm");
	if (it==s.end()) cout<<"No"<<endl;
		else cout<<it->first<<"  "<<it->second<<endl;
	
    //删除的两种方法	
    s.erase("Tom");
    it=s.find("Amey");
    s.erase(it);

    //迭代器遍历方法 
    for(it=s.begin(); it!= s.end(); it++){ 
        cout<<it->first<<"  "<<it->second<<endl;
    }
}

插入:

用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是插入不了的数据,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值。

查找:

用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了。

用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。传入的参数是要查找的key。

自定义map:

1.从大到小的顺序。

    map<string,int, greater<string> > s;   //map定义 
    map<string,int, greater<string> >::iterator it;   //迭代器 

2.结构体Map

#include<iostream>
#include<string>
#include<map>

using namespace std;

struct sdu{
	int math,chi,sin;
};

int main(){  
    map<string,sdu > s;   //map定义 
    map<string,sdu >::iterator it;   //迭代器 
     
    sdu a;  a.math=100;  a.chi=98;  a.sin=20;
    
    s.insert(make_pair("Amey",a));
    //s.insert(pair<string,int>("Maroon",100));
    s["Tom"].math=88; s["Tom"].chi=100; s["Tom"].sin=85;
    
   	//迭代器遍历方法 
    for(it=s.begin(); it!= s.end(); it++){ 
        cout<<it->first<<" "<<s[it->first].math<<" "<<s[it->first].chi<<" "<<s[it->first].sin<<endl;
    }
}

3.重载小于操作符

#include <map>
#include <iostream>

using namespace std;

struct  sdu{
	int x;
	int y;
	bool operator < (const sdu &o) const{ 
		return x < o.x || y < o.y;
	}
};
 
int main(){ 
	map<sdu,string> s;
	sdu a={ 1, 2 };  s[a] = "abc";
	a={ 6, 5 };  s[a] = "ss";
	a={ 4, 100 };  s[a] = "pp";
	map<sdu, string>::iterator it;
	for (it = s.begin(); it != s.end();it++){
		cout << it->first.x << " " << it->first.y << " " << it->second << std::endl;
	}
}
  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STLmap是一个非常有用的容器,它提供了一种关联数组的方式,可以将任意类型的数据关联起来。map底层使用红黑树实现,因此查找和插入操作的时间复杂度为O(logn)。 在使用map时,需要定义一个键和值的类型。键必须是可比较的类型,并且支持小于操作符。例如可以使用字符串作为键,而值可以是任意类型的数据。通过[]操作符可以访问每个键-值对,也可以使用迭代器遍历map的所有数据。 map还提供了许多其他的方法,包括插入、查找、删除、遍历、清空等。此外,map还具有自动排序的功能,键-值对按照键的大小自动排序。当需要按照键进行排序时,使用map将非常方便。 总的来说,STLmap可以提供一种快速、方便、可靠的方法将数据关联起来,特别适合对数据进行查找和排序。借助于map的丰富功能,能够提高程序的效率和性能。 ### 回答2: STL mapC++ STL 的一种容器,它是一个关联容器,它以键对值的方式存储数据。STL map 的元素是按照其键的大小排列的,通常使用红黑树这样的自平衡二叉搜索树来实现底层存储结构。因此,它支持快速插入、删除和查找操作。 STL map 的键和值都可以是任何可比较的类型,如整数、浮点数、字符串、对象等。在 map ,键是唯一的,每个键只能对应一个值。如果插入相同的键,则会替换已有键对应的值。 STL map 的基本操作有插入、删除和查找操作。插入操作可以使用 insert() 函数或者括号符[],例如: ```c++ #include <map> #include <iostream> using namespace std; int main() { map<string, int> scores; // 方式一:使用 insert() scores.insert(make_pair("Tom", 90)); // 方式二:使用括号符[] scores["Jerry"] = 80; // 输出 scores 的所有元素 for (map<string, int>::iterator it = scores.begin(); it != scores.end(); ++it) { cout << it->first << ": " << it->second << endl; } return 0; } ``` 删除操作可以使用 erase() 函数,例如: ```c++ scores.erase("Tom"); ``` 查找操作可以使用 find() 函数,例如: ```c++ map<string, int>::iterator it = scores.find("Jerry"); if (it != scores.end()) { cout << "Jerry's score is " << it->second << endl; } else { cout << "Jerry is not in the scores map" << endl; } ``` 此外,还有其他常用操作,如:判断 map 是否为空、获取 map 的大小等。STL map 还支持迭代器等高级操作。 综上所述,STL map 是一种很常用的 C++ STL 容器,它提供了一种便捷的存储和管理键值对的方法,可以快速实现查找、添加、删除等操作。对于大多数场景,STL map 都是一个非常不错的选择。 ### 回答3: STL MapC++非常重要的一个容器。map本质上是一颗红黑树,可以自动排序,支持基于关键字的快速查找。其关键字和值可以是任何可比较类型。 由于它是一颗红黑树,因此每个元素在树的位置是由关键字决定的。这个特性使得查找、操作和插入元素都非常高效。此外,map还支持基于关键字的范围查找和删除。 使用map时需要注意,操作map时会产生额外的开销,因此在大量操作时,可能需要考虑使用其他容器。 另外,map实现具有高度的迭代器稳定性,这意味着一旦某个元素被插入或删除,对其他元素的迭代器不会受到影响。这也使得map非常适合在需要基于关键字进行高效访问的情况下维护数据。 总之,STL MapC++标准库提供的一个非常方便的容器,可以快速实现基于关键字的查找和排序。在实际应用,需要根据具体场景选择合适的容器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值