map的两种插入方式

#include <iostream>
#include <map>


int main(int argc, char** argv) {
    std::map<int, int> tMap ;
    tMap[1] = 100 ;
    tMap[2] = 200 ;
    tMap[3] = 300 ;
    tMap[1] = 111 ; // 已经有相同的key了 强制覆盖  tMap[1] == 111
    tMap.insert(std::make_pair(1, 111111)) ; // 已经有相同的key了 插入不进去了   tMap[1] == 111


    return 0 ;
}

### Map与List容器的区别 #### 数据结构差异 Map 和 List 是两种不同的数据结构。 - **List** 是一种有序的集合,允许重复元素存在,并按照插入顺序保存元素[^4]。 - **Map** 则是一种键值对(Key-Value Pair)的数据结构,其中每个键映射到一个值,且键不允许重复[^1]。 #### 存储方式 - **List** 的实现类如 `ArrayList` 使用动态数组来存储元素,而 `LinkedList` 使用双向链表来存储元素。 - **Map** 的常见实现类包括 `HashMap`、`TreeMap` 等。这些实现基于哈希表或红黑树等底层数据结构来管理键值对关系。 #### 访问机制 - 对于 **List**,可以通过索引来快速访问特定位置上的元素,时间复杂度为 O(1)。 - 而对于 **Map**,则通过键来进行查找操作,其性能取决于具体实现:例如,在 `HashMap` 中平均查找时间为 O(1),但在 `TreeMap` 中由于使用平衡二叉树,则为 O(log n)[^2]。 #### 是否支持重复项 - 在 **List** 中可以包含多个相同的对象实例作为独立条目。 - 反之,在任何标准形式下的 **Map** 实现里都不允许多个具有相同 key 的 entry 同时存在于同一个 map 当中;不过 value 部分是可以重复出现的不同实体关联起来形成一组组记录。 ### 适用场景分析 #### List适合的应用场合 当应用程序需要维护一系列按一定次序排列的对象副本并可能经常执行随机读取或者追加新成员这样的动作时,List 就显得尤为合适了,尤其是如果还涉及到大量的迭代过程的话更是如此: ```java // ArrayList 示例 List<String> arrayListExample = new ArrayList<>(); arrayListExample.add("Element1"); arrayListExample.add("Element2"); for (String element : arrayListExample) { System.out.println(element); } ``` 另一方面,假如业务逻辑里面涉及到了频繁地在中间部分插入/删除节点的情况之下考虑采用 LinkedList 更佳一些因为相比于前者后者在这方面表现得更加高效尽管牺牲了一定程度上的空间利用率以及首尾两端的操作速度优势. #### Map的最佳实践领域 每当遇到需求是要建立某种一对一的关系表示或者是想要利用散列技术加速检索流程的时候就应该优先选用 Maps 类型的数据结构而不是 Lists 或者其他类型的 collections 来解决问题. 下面给出一段简单的 HashMap 应用例子说明如何创建和查询一张学生姓名对应成绩表格的信息: ```java // HashMap 示例 Map<String, Integer> studentScores = new HashMap<>(); studentScores.put("Alice", 90); studentScores.put("Bob", 85); System.out.println(studentScores.get("Alice")); // 输出 Alice 的分数 ``` 另外值得注意的是某些特殊情况下也许会希望得到经过排序后的结果集此时就可以借助 TreeMap 达成目的因为它内部采用了红黑树算法从而保证所有 keys 自动呈升序排放特性: ```java // TreeMap 示例 Map<Integer, String> sortedGrades = new TreeMap<>(Collections.reverseOrder()); sortedGrades.put(90, "A+"); sortedGrades.put(75, "B"); for(Map.Entry<Integer,String>entry:sortedGrades.entrySet()){ System.out.println(entry.getKey()+"="+entry.getValue()); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值