std::map用法总结

给出了map的基本用法如插入、查找、删除、遍历等等,同时告诉你如何实现双键map,包括

(1) 只有两个键都匹配才命中目标
(2) 两个键中任意一个匹配就命中目标

可以扩展到多键


(一) 介绍
特点:
1.map将Key的object和T的Object绑定到一起,因此是一种Pair Associative Container, 表示其value type为 pair。
2.它同时也是Unique Associative Container,表示没有两个元素具有相同的Key。
3.它还是一种Sorted Associative Container,因此第三个参数只能是less,greater之类的functor, 相比较而言,
hash table是 equal_to, not_equal_to之类的functor。
(二) 基本用法
通过以下范例,可以看出map的一些基本用法: 插入、查找、删除、遍历等等。
/* 这个是MS的bug,看着心烦,屏蔽掉警告 */
#if defined (_MSC_VER)
#pragma warning(disable: 4786)
#endif
#include <iostream>
#include <map>
#include <algorithm>
int main(int argc, char *argv[])
{
    /* define a map */
    std::map _map;
   
    /* insert */
    _map.insert( std::map::value_type(0, 32.8) );
    _map.insert( std::map::value_type(1, 33.2) );
    _map.insert( std::map::value_type(2, 35.8) );
    _map.insert( std::map::value_type(3, 36.4) );
    _map.insert( std::map::value_type(4, 37.8) );
    _map.insert( std::map::value_type(5, 35.8) );
   
    /* 这个是常用的一种map赋值方法 */
    _map[7] = 245.3;
   
    /* find by key */
    std::map::iterator itr;
    itr = _map.find(4);
   
    if( itr != _map.end() )
    {
        std::cout << "Item:" << itr->first << " found, content: " << itr->second << std::endl;
    }
   
    std::cout << std::endl;
   
    /* delete item from map */
    if( itr != _map.end() )
    {
        _map.erase(itr);
    }
   
    /* travel through a map */
    std::map::iterator itr1 = _map.begin();
    for( ; itr1 != _map.end(); ++itr1 )
    {
        std::cout << "Item:" << itr1->first << ", content: " << itr1->second << std::endl;
    }
   
    std::cout << std::endl;
   
    /* empty a map */
    _map.clear();
   
    return 0;
}

(三) 当Key是结构时该如何定义结构
比如 Key是结构MyStruct类型, 此时map可以定义如下:
std::map > _map;
其中Compare 缺省是std::less,这里可以不写,自定义的结构必须实现Compare指定的比较操作,因此自定义结构
MyStruct必须按照如下写法:
struct MyStruct
{
    int key;
   
    bool operator < ( const MyStruct rhs) const
   {
        return key < rhs.key;
   }
};
当然也可以实现全局operator <
bool operator < ( const MyStruct lhs, const MyStruct rhs)
{
    return lhs.key < rhs.key;
}
另外,当Compare 是std::greater时,需要实现 operator >
(四) 如何实现两个Key的map, 只有两个Key都匹配才命中目标
可以定义结构MyStruct如下:
struct MyStruct
{
    int key1;
    double key2
   
    bool operator < ( const MyStruct rhs) const
   {
        /* 两个key必须都匹配才命中 */
        return ( key1 < rhs.key1 || key2 < rhs.key2 );
   }
};
(五) 如何实现两个Key的map, 两个Key中任意一个匹配就命中目标
可以定义结构MyStruct如下:
struct MyStruct
{
    int key1;
    double key2
   
    bool operator < ( const MyStruct rhs) const
   {
        /* 两个key任意一个匹配就命中 */
        return ( ( key1 < rhs.key1 || (key1 > rhs.key1 && key2 < rhs.key2 ) ) && ( key2 < rhs.key2 ) );
   }
};
(六) 如果被存储的T允许重复,可用multimap
(七) 如果Key本身就是需要被存储的T, 只要将map换成set就好了

转载于:https://www.cnblogs.com/shenyanyun/archive/2010/05/19/1739308.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题库 java_java题库

1.public class T {int squares81;public static void main(String[] args) {new T().go();}void go(){incr(squares);System.out.println(squares);}void incr(int squares){squares10;}返回值为82&#xff0c;没有改变squares的值&#xff0c;不是引用传递不是c2.建个test类 …

Javascript弹出div层

这是一个DIV弹窗效果!将鼠标移动到此 点击这里查看弹出窗口 这是文章“JavaScript弹出窗口DIV层效果代码”的演示页面&#xff0c;点这里查看原文&#xff01; 转载于:https://www.cnblogs.com/xxxxx/archive/2010/05/22/1741707.html

java什么是同步_什么是同步?什么是互斥?

现代操作系统基本都是多任务操作系统&#xff0c;即同时有大量可调度实体在运行。在多任务操作系统中&#xff0c;同时运行的多个任务可能&#xff1a;都需要访问/使用同一种资源 多个任务之间有依赖关系&#xff0c;某个任务的运行依赖于另一个任务 这两种情形是多任务编程中遇…

python enumerate()

描述 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列&#xff0c;同时列出数据和数据下标&#xff0c;一般用在 for 循环当中。 语法 以下是 enumerate() 方法的语法: enumerate(sequence, [start0]) 参数 sequence -- 一个序列、迭代器…

java做报表_一步一步使用POI做java报表

读取和重写 WorkbooksPOIFSFileSystem fs new POIFSFileSystem(new FileInputStream("workbook.xls"));HSSFWorkbook wb new HSSFWorkbook(fs);HSSFSheet sheet wb.getSheetAt(0);HSSFRow row sheet.getRow(2);HSSFCell cell row.getCell((short)3);if (cell nu…

为考试而准备1——无线WCDMA 网规精选(04年)

2010年的网优注定将与大大小小的考试紧密相联&#xff0c;而考试的侧重方面于3G为主。 一、填空题 1. BSC6800可以提供单机柜解决方案&#xff0c;单机柜可以支持 3200 等效语音信道&#xff0c;支持6万 等效语音用户。BSC6800每块WFMR板处理 16 个载频扇区&#xff0c;每个载频…

SQL的数据定义功能及语句:

定义各种数据库的“对象” 模式定义表定义视图定义索引定义SQL的数据定义语句 操作对象操作方式创建删除修改 模式CREATE SCHEMADROP SCHEMA 表CREATE TABLEDROP TABLEALTEB TABLE 视图CREATE VIEWDROP VIEW 索引CREATE INDEXDROP INDEXALTEB INDEX 转载于:https://www.cnbl…

java程序转成mac应用,如何为Java应用程序创建Mac安装程序?

I have created an executable JAR file for my Java application. If I double-click then it works fine. But I want to create installer for Mac OS, because I cannot give a JAR file to my users. Any suggestions?解决方案Well, all you have to do here is to creat…

java 怎么页面授权访问_Java调用Linkedin接口API之:获取授权

配置领英应用配置地址&#xff1a;https://www.linkedin.com/secure/developer?newapp强烈建议您使用 HTTPS网址必须是绝对网址 (例如: “https://example.com/auth/callbac”&#xff0c;而不是“/auth/callback”)网址参数会被忽略 (即 https://example.com/?id1 与 https:…

【转载】别了,摩托罗拉(十):“战争部落”和“独立王国”

摩托罗拉于1928年由保罗高尔文(Paul V. Galvin)及其兄弟约瑟夫高尔文(Joseph Galvin)创建,最初是一家汽车收音机小厂,兄弟二人将其发展为对讲机、彩色电视机生产巨头.罗伯特高尔文(Robert L. Galvin)继承了父亲和叔叔的衣钵,在任摩托罗拉CEO的27年间,进入半导体和无线通信行业,…

java orika_常见Bean映射工具分析评测及Orika介绍

Bean映射工具选择工作中&#xff0c;我们经常需要将对象转换成不同的形式以适应不同的api&#xff0c;或者在不同业务层中传输对象而不同分层的对象存在不同的格式&#xff0c;因此我们需要编写映射代码将对象中的属性值从一种类型转换成另一种类型。进行这种转换除了手动编写大…

【转载】别了,摩托罗拉(十六):平台之乱

除了愚蠢的价格战,占摩托罗拉总收入70%的手机业务在詹德手上能跌到今天不到10%的全球市场份额,重要的原因还有三个.一个是缺乏技术规划能力,导致手机操作系统平台战略混乱不堪,另一个是错失3G,还有一个原因则是在中国这个世界上最大的手机市场完败于诺基亚.  “手机的功能和易…

JavaScript 字符串转数字

parseFloat("22.34.5"); //returns 22.34 Math.floor()&#xff0c;不四舍五入 &#xff0c;向下取整Math.floor(2.98)2 转载于:https://www.cnblogs.com/sea-stream/p/11100348.html

如何在Java中使用表达式_如何在java中计算表达式?

我在快速谷歌后发现了这段代码&#xff1a;import java.util.Stack;/*** Class to evaluate infix and postfix expressions.** author Paul E. Davis (feedbackwillcode4beer.com)*/public class InfixPostfixEvaluator {/*** Operators in reverse order of precedence.*/pri…