24人参与 • 2025-05-19 • C/C++
map
是c++ stl中的关联容器,存储键值对(key-value pairs)。插入元素时有四种主要方式,各有特点:
#include <map> using namespace std; map<int, string> mapstu; // 键为int,值为string
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
,如果键已存在,插入会失败,不会覆盖原有值。
mapstu.insert(make_pair(2, "李四"));
优点:
pair<iterator, bool>
mapstu.insert(map<int, string>::value_type(3, "王五"));
特点:
value_type
是map内部定义的typedef,等同于pair<const key, t>
pair<iterator, bool>
mapstu[4] = "赵六"; // 插入 mapstu[4] = "小赵六"; // 修改
关键特性:
string strname = mapstu[8]; // 键8不存在时会自动插入
返回值:返回值的引用,可直接修改
特殊用法:
mapstu[6] = mapstu[5]; // 复制键5的值到键6 mapstu[7] = mapstu[4]; // 复制键4的值到键7
特性 | 方式一(pair) | 方式二(make_pair) | 方式三(value_type) | 方式四([]) |
---|---|---|---|---|
语法复杂度 | 高 | 中 | 高 | 低 |
返回值 | pair<iter,bool> | pair<iter,bool> | pair<iter,bool> | 值引用 |
键存在时的行为 | 不覆盖 | 不覆盖 | 不覆盖 | 覆盖 |
可能意外插入 | 否 | 否 | 否 | 是 |
类型安全性 | 高 | 中 | 最高 | 低 |
性能 | 中等 | 中等 | 中等 | 稍快 |
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; }
map
中每个键只能出现一次,重复插入会失败insert
比[]
更高效insert
+检查返回值[]
操作符find
检查键是否存在make_pair
或emplace
(c++11)#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; }
c++11引入了更高效的emplace
方法:
mapstu.emplace(5, "钱七"); // 直接在容器内构造元素,避免临时对象
insert
和emplace
提供强异常保证:如果插入失败,容器保持不变。
对于大批量插入:
如果键已知有序,可以使用提示位置插入:
mapstu.insert(hint_iterator, make_pair(10, "孙八"));
或者先构建vector再批量插入
到此这篇关于c++ map容器: 插入操作的文章就介绍到这了,更多相关c++ map容器插入内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论