我可以使用总是置地来代替单个元素插入的插入吗?
Can I use always emplace to replace insert for single element insertion?
我想知道在将单个元素插入 STL 容器(如 set、unordered_set(时,是否可以始终使用 emplace
来替换insert
?
从签名来看,emplace
更简单,不涉及重载。停止使用insert
并一直使用emplace
有什么问题吗?
注意:有 SO 问题询问 emplace
和 insert
/push_back
等之间的区别(例如这里、这里和这里(我理解其中的区别,在我看来,emplace
各方面都更好。我只是想确认是否可以弃用insert
.
这里有一些例子可以适应emplace
和insert
,显示行为何时可能不同。
这些例子可能看起来有点人为,所以我会举一个希望看起来不那么像
人心的例子:#include <set>
template <typename T>
T id(T x) { return x; }
int main() {
std::set<int(*)(int)> s;
s.insert(id); // OK
s.emplace(id); // error
s.emplace(id<int>); // OK
}
insert
可以推断出id
的模板参数,因为它知道自己想要什么类型。对于emplace
,除非您明确指定,否则会出现错误。
总是? 不,当然不是。
考虑以下示例,该示例使用std::vector
为简单起见(假设uptr
是一个智能指针,通常与std::unique_ptr
类似(:
std::vector<uptr<T>> vec;
vec.insert(vec.begin(), new T());
它是异常安全的。 一个临时uptr
被创建传递给insert
,它被移动到向量中。 如果矢量的重新分配失败,则分配的T
由智能指针拥有,该指针会正确删除它。
比较:
std::vector<std::uptr<T>> vec;
vec.emplace(vec.begin(), new T());
不允许emplace
创建临时对象。 uptr
将在矢量中就地创建一次。 如果重新分配失败,则没有就地创建的位置,并且不会初始化任何智能指针。 T
将被泄露。
当然,最好的选择是:
std::vector<std::unique_ptr<T>> vec;
vec.insert(vec.begin(), make_unique<T>());
它使用标准智能指针并使智能指针创建显式。
相关文章:
- 如何在向量数组中插入元素?
- 有没有更快的方法可以在 std::vector 中插入元素
- 映射C++按值排序和插入元素
- 如何在一对集合的向量中插入元素?vector<pair<int,set<string>>>
- 当索引位于末尾和空数组时,向数组插入元素时出现问题
- 在 QSet 中插入元素<QString>并检索 ,删除 QSet 的最后一项
- C++ 在列表末尾插入元素的列表的 STL 向量
- 插入元素后矢量容量增加
- 如何在 c++ 集中插入元素,直到按下 Enter 键
- C++向量插入元素
- 有没有办法在unordered_map的某个位置插入元素
- 重新插入元素可以"re-validate"迭代器吗?
- 内部源代码 - 在链接列表实现中插入元素上的删除会破坏整个应用程序
- 在链表中插入元素
- stl 中是否有任何数据结构可以在 O(1) 或 O(log n) 中插入元素,我可以在其上编写自己的bin_searc
- 如何在将数据结构插入元素后继续迭代数据结构
- 有没有一种方法可以在std::向量的特定位置重复插入元素
- 在向量 (C++) 中保留插入元素的地址
- 插入元素后Unordered_map变空,我做错了什么
- 循环a std :: unordered_map,序列始终是i插入元素的序列