std::
deque::emplace
公众成员函数 <deque>
template <class... Args>
iterator emplace (const_iterator position, Args&&... args);
构造和插入元素
通过在position插入新元素扩展容器。这个新元素使用args作为其构造的参数构造。
容器大小加1.
双端队列设计用于从序列的末尾或开头高效地执行插入(和删除)。
在其他位置插入通常比在list或forward_list容器中插入效率低。
请参阅emplace_front和emplace_back,了解直接在容器开头或结尾扩展的成员函数。
元素是通过调用allocator_traits::construct和转发的参数构造的。
☲ 参数
-
position
-
容器中插入新元素的位置。
成员类型const_iterator是指向常量元素的随机访问迭代器类型。
-
args
-
为构造新元素而传递的参数。
☉ 返回值
指向新放置的元素的迭代器。
成员类型迭代器是一种指向元素的随机访问迭代器类型。
新元素的存储是使用allocator_traits<allocator_type>::construct()分配的,如果失败,
可能会抛出异常(对于默认的分配器,如果分配请求不成功,会抛出bad_alloc)。
☣ 示例
// deque::emplace
#include <iostream>
#include <deque>
int main ()
{
std::deque<int> mydeque = {10,20,30};
auto it = mydeque.emplace ( mydeque.begin()+1, 100 );
mydeque.emplace ( it, 200 );
mydeque.emplace ( mydeque.end(), 300 );
std::cout << "mydeque contains:";
for (auto& x: mydeque)
std::cout << ' ' << x;
std::cout << '\n';
return 0;
} |
输出:
mydeque contains: 10 200 100 20 30 300
✥ 复杂度
根据特定的标准库实现,在位置和deque的一个端点之间的元素数量最多为线性。
☣ 迭代器的有效性
如果插入发生在序列的开头或结尾,则与该容器相关的所有迭代器都会失效,
但指针和引用仍然有效,它们指向的元素与调用前相同。
如果插入发生在deque容器的其他位置,所有与该容器相关的迭代器、指针和引用都会失效。
⇄ 数据竞争
容器被修改。
如果插入发生在序列的开头或结尾,则不会访问所包含的元素(请参阅上面的迭代器有效性)。
如果它发生在其他地方,则并发访问元素是不安全的。
☂ 异常安全性
如果位置是开始或结束,则在异常情况下容器中没有变化(强保证)。
否则,容器将保证以有效状态结束(基本保证)。
如果相应的参数不支持allocator_traits::construct,或者如果position无效,它将导致未定义的行为。
🍄 另请参阅
deque::erase |
删除元素(公众成员函数) |
deque::emplace_front |
构造并在开头插入元素 (公众成员函数) |
deque::emplace_back |
构造并在末尾插入元素 (公众成员函数) |
deque::assign |
分配容器的内容 (公众成员函数) |
deque::insert |
插入元素 (公众成员函数) |