1. map插入操作基础
map
是c++ stl中的关联容器,存储键值对(key-value pairs)。插入元素时有四种主要方式,各有特点:
1.1 头文件与声明
#include <map> using namespace std; map<int, string> mapstu; // 键为int,值为string
2. 四种插入方式详解
2.1 方式一:构造pair后插入
pair<map<int, string>::iterator, bool> ret = mapstu.insert(pair<int, string>(1, "张三"));
特点:
- 显式构造
pair
对象 insert
返回一个pair<iterator, bool>
first
:指向插入元素的迭代器second
:是否插入成功(bool)
示例判断:
if (ret.second == true) { cout << "插入成功!value:" << (*(ret.first)).second << endl; } else { cout << "插入失败!" << endl; // 键已存在时会失败 }
注意:对于map
,如果键已存在,插入会失败,不会覆盖原有值。
2.2 方式二:使用make_pair
mapstu.insert(make_pair(2, "李四"));
优点:
- 语法更简洁,无需显式指定模板参数
- 自动推导pair类型
- 同样返回
pair<iterator, bool>
2.3 方式三:使用value_type
mapstu.insert(map<int, string>::value_type(3, "王五"));
特点:
value_type
是map内部定义的typedef,等同于pair<const key, t>
- 类型安全,确保键的类型正确
- 同样返回
pair<iterator, bool>
2.4 方式四:使用[]操作符
mapstu[4] = "赵六"; // 插入 mapstu[4] = "小赵六"; // 修改
关键特性:
- 查找+插入/修改:先查找键是否存在,不存在则插入,存在则修改
- 可能意外插入:访问不存在的键时会自动插入
string strname = mapstu[8]; // 键8不存在时会自动插入
返回值:返回值的引用,可直接修改
特殊用法:
mapstu[6] = mapstu[5]; // 复制键5的值到键6 mapstu[7] = mapstu[4]; // 复制键4的值到键7
3. 四种方式对比
特性 | 方式一(pair) | 方式二(make_pair) | 方式三(value_type) | 方式四([]) |
---|---|---|---|---|
语法复杂度 | 高 | 中 | 高 | 低 |
返回值 | pair<iter,bool> | pair<iter,bool> | pair<iter,bool> | 值引用 |
键存在时的行为 | 不覆盖 | 不覆盖 | 不覆盖 | 覆盖 |
可能意外插入 | 否 | 否 | 否 | 是 |
类型安全性 | 高 | 中 | 最高 | 低 |
性能 | 中等 | 中等 | 中等 | 稍快 |
4. 遍历map内容
for (map<int, string>::iterator it = mapstu.begin(); it != mapstu.end(); it++) { cout << it->first << ", " << it->second << endl; }
或使用c++11范围for循环:
for (const auto& pair : mapstu) { cout << pair.first << ", " << pair.second << endl; }
5. 关键注意事项
- 键的唯一性:
map
中每个键只能出现一次,重复插入会失败 - 自动排序:元素按键的升序自动排列
- []操作符的风险:
- 可能意外插入新元素
- 访问不存在的键时会用默认值创建新元素
- 性能考虑:
- 插入操作平均时间复杂度o(log n)
- 对于已知不存在的键,使用
insert
比[]
更高效
6. 实际应用建议
- 需要知道是否插入成功:使用
insert
+检查返回值 - 需要覆盖现有值:使用
[]
操作符 - 避免意外插入:先用
find
检查键是否存在 - 代码简洁性:优先考虑
make_pair
或emplace
(c++11)
7. 完整代码回顾
#include <map> #include <iostream> using namespace std; int main() { map<int, string> mapstu; // 方式一 auto ret = mapstu.insert(pair<int, string>(1, "张三")); if (ret.second) { cout << "插入成功!value:" << ret.first->second << endl; } else { cout << "插入失败!" << endl; } // 重复插入测试 ret = mapstu.insert(pair<int, string>(1, "小张三")); if (!ret.second) { cout << "插入小张三失败!" << endl; } // 方式二 mapstu.insert(make_pair(2, "李四")); // 方式三 mapstu.insert(map<int, string>::value_type(3, "王五")); // 方式四 mapstu[4] = "赵六"; mapstu[4] = "小赵六"; // 覆盖 // 特殊用法 mapstu[6] = mapstu[5]; // 复制 mapstu[7] = mapstu[4]; // 复制 // 遍历输出 for (const auto& pair : mapstu) { cout << pair.first << ", " << pair.second << endl; } system("pause"); return 0; }
8. 扩展知识
8.1 c++11的emplace
c++11引入了更高效的emplace
方法:
mapstu.emplace(5, "钱七"); // 直接在容器内构造元素,避免临时对象
8.2 异常安全性
insert
和emplace
提供强异常保证:如果插入失败,容器保持不变。
8.3 性能优化
对于大批量插入:
如果键已知有序,可以使用提示位置插入:
mapstu.insert(hint_iterator, make_pair(10, "孙八"));
或者先构建vector再批量插入
到此这篇关于c++ map容器: 插入操作的文章就介绍到这了,更多相关c++ map容器插入内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论