向地图中插入元素的推荐方式
Recommended way to insert elements into map
可能重复:
在STL映射中,使用map::insert是否比[]更好?
当我在地图中插入元素时,我想知道推荐的方法是什么。我应该吗
map[key] = value;
或
map.insert(std::pair<key_type, value_type>(key, value));
我做了以下快速测试:
#include <map>
#include <string>
#include <iostream>
class Food {
public:
Food(const std::string& name) : name(name) { std::cout << "constructor with string parameter" << std::endl; }
Food(const Food& f) : name(f.name) { std::cout << "copy" << std::endl; }
Food& operator=(const Food& f) { name = f.name; std::cout << "=" << std::endl; return *this; }
Food() { std::cout << "default" << std::endl; }
std::string name;
};
int main() {
std::map<std::string, Food> m0;
/*
1) constructor with string parameter
2) copy
3) copy
4) copy
*/
m0.insert(std::pair<std::string, Food>("Key", Food("Ice Cream")));
/*
1) constructor with string parameter
2) default
3) copy
4) copy
5) =
*/
// If we do not provide default constructor.
// C2512: 'Food::Food' : no appropriate default constructor available
m0["Key"] = Food("Ice Cream");
}
- 通过使用成员函数
insert
,我意识到将涉及较少值的函数调用。那么,使用insert
是推荐的方式吗 - 当使用
map[key] = value
方式时,为什么需要默认构造函数
我知道insert
不会覆盖存在键值对,但map[key] = value
会覆盖。然而,当我试图在两者中进行选择时,这是我唯一考虑的因素吗?
怎么样
- 性能
- 值的默认构造函数的可用性
insert
不是推荐的方式,它是插入到地图中的方式之一。与operator[]
的区别在于,insert
可以判断元素是否插入到映射中。此外,如果您的类没有默认构造函数,则必须使用insert
operator[]
需要默认构造函数,因为映射会检查元素是否存在。如果没有,则使用默认构造函数创建一个,并返回一个引用(或对它的const引用(
因为映射容器不允许重复的键值,所以插入操作会检查插入的每个元素是否在容器中已经存在具有相同键值的另一个元素,如果存在,则不会插入该元素,并且不会以任何方式更改其映射值。
如果要插入新元素,请使用insert
。insert
不会覆盖现有元素,您可以验证是否没有以前存在的元素:
if ( !myMap.insert( std::make_pair( key, value ) ).second ) {
// Element already present...
}
如果要覆盖可能存在的元素,请使用[]
:
myMap[ key ] = value;
assert( myMap.find( key )->second == value ); // post-condition
此表单将覆盖任何现有条目。
引用:
因为映射容器不允许重复的键值,所以插入操作会检查插入的每个元素是否在容器中已经存在具有相同键值的另一个元素,如果存在,则不会插入该元素,并且不会以任何方式更改其映射值。
因此,如果密钥已经存在,insert不会更改值,[] operator
会更改。
编辑:
这让我想起了最近的另一个问题——为什么使用at()
而不是[] operator
来从向量中检索值。显然,如果索引越界,at()
会抛出异常,而[] operator
不会。在这些情况下,最好查看函数的文档,因为它们会为您提供所有详细信息。但一般来说,没有(或者至少不应该有(两个函数/运算符做完全相同的事情。
我的猜测是,在内部,insert()
将首先检查条目,然后自己使用[] operator
。
map[key] = value
以简化语法。它更容易读写。
需要使用默认构造函数的原因是map[key]
是在赋值之前求值的。若映射中不存在键,则会创建一个新的键(使用默认构造函数(,并从operator[]
返回对它的引用。
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果第一个元素包含任何零,则我的程序以不希望的方式运行
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 对列表列表中的元素进行分组的最佳方式
- 是否有任何优雅的方式来遍历元素位置可以更改的列表?
- 使用现代C++在 Eigen3 矩阵上使用 for 循环进行元素操作的优雅方式
- 如何以简洁的方式安全地访问容器中的每个第 n 个元素?
- 以C++递归方式对链表中的元素求和
- 以编程方式推断出枚举的大小,独立于其元素的价值
- 以重复的方式将元素添加到 std::vector
- 干燥的方式来构建具有相同初始化器列表的数组的所有元素
- 如何以正确的方式找到向量中的元素-C
- 传递数组的一种病理方式:参考第一个元素
- 在哪种方式搜索容器中的元素的方式更有效
- 以最新的C 的类型安全方式从枚举中随机选择元素
- 以线性最小二乘方式求解系统 Ax=b,具有复元素和下三角形平方 A 矩阵
- 找到组合对之间共享元素的最佳方式
- memmove会移动元素(就像前面的方式相同),还是一次抓住整个内存块
- 一种方式链接列表和不需要的第一个元素AFRTER填充
- 访问数组元素的不同方式