C++ 前/后插入器就位

C++ 前/后插入器就位,c++,iterator,c++14,C++,Iterator,C++14,在学习过程中,我遇到了前后迭代器,我想知道是否有办法让它们在适当的位置创建容器元素。从文档中可以看出,容器似乎需要实现push_back函数,以便与back_迭代器一起使用。但是,有没有一种方法可以在元素创建上进行定位呢?从概念上讲,您所问的是不可能的 迭代器作为一个概念表示某个对象的抽象,该对象在该类型的一系列元素中引用某个类型的元素。因此,的核心特性是能够取消对迭代器的引用。也就是说,*它是一个合法的表达式(尽管基本迭代器没有说明它的返回值是什么) 通过以下方式实现*it:。。。没有实施它。

在学习过程中,我遇到了前后迭代器,我想知道是否有办法让它们在适当的位置创建容器元素。从文档中可以看出,容器似乎需要实现push_back函数,以便与back_迭代器一起使用。但是,有没有一种方法可以在元素创建上进行定位呢?

从概念上讲,您所问的是不可能的

迭代器作为一个概念表示某个对象的抽象,该对象在该类型的一系列元素中引用某个类型的元素。因此,的核心特性是能够取消对迭代器的引用。也就是说,
*它是一个合法的表达式(尽管基本迭代器没有说明它的返回值是什么)

通过以下方式实现
*it
:。。。没有实施它。允许
*它
,但它的结果未指定,因此您不能真正直接使用它。相反,应该在表达式中使用它,如
*it++=value。实际上是
操作符=
重载调用了
push\u-back

这模仿了自然迭代器(如指针)的行为。当您实际使用
操作符=
调用
容器时,它允许outputierator假装允许您分配现有值。
*
++
只是为了匹配转发器迭代器的接口

但是
operator=
是一个操作符。它是一个只接受两个参数的函数:迭代器(左侧)和要分配给它的值

emplace
-类函数通过使用任意参数序列调用构造函数来工作。通过
operator=
无法做到这一点。由于OutputIterator的接口仅限于此,因此迭代器没有有效的方法使用这样的就地构造


请注意,技术上有一种方法可以做到这一点。您需要的是一种将多个值打包到单个值中的方法:

auto it = back_emplacer(...);
*it++ = std::forward_as_tuple(...);
操作符=
如下所示:

template<typename ...Args>
back_emplace_iterator &operator=(std::tuple<Args...> &&args)
{
  std::apply(
    [container](auto ...&&args)
      {container->emplace_back(std::forward<decltype(args)>(args)...);},
    std::forward<std::tuple<Args>>(args));
  return *this;
}
模板
返回位置迭代器和运算符=(std::tuple&&args)
{
标准::应用(
[容器](自动…&参数)
{container->emplace_back(std::forward(args)…);},
标准:转发(args);
归还*这个;
}

当然,缺点是您必须手动将数据打包到转发
元组中

emplace\u back
方法,但没有相应的
back\u emplacer
。由于
emplace\u back
采用了大量参数,因此不清楚后者的外观和使用方法。请注意,
operator=
有两个重载,一个重载用于
const typename Container::value\u type&
(即复制),另一个重载用于
typename Container::value\u type&
(即移动)。