gpt4 book ai didi

c++ - 前/后插入器就位

转载 作者:搜寻专家 更新时间:2023-10-31 02:07:42 30 4
gpt4 key购买 nike

在我的学习过程中,我遇到了前后迭代器,我想知道是否有办法让它们就地创建容器元素。从文档来看,容器似乎需要实现 push_back 函数才能与 back_iterator 一起使用。但是有没有一种方法可以放置在元素创建上?

最佳答案

你问的在概念上是不可能的。

迭代器作为一个概念表示某个对象的抽象,该对象引用该类型的一系列元素中的某个类型的元素。因此,basic Iterator concept具有取消引用迭代器的能力作为核心功能。即 *it 是一个合法的表达式(虽然基本的 Iterator 没有说明 this 的返回值是什么)。

back_insert_iterator实现 *it 通过...不实现它。 OutputIterator concept允许 *it,但它的结果是未指定的,所以你不能直接使用它。相反,您应该在类似 *it++ = value; 的表达式中使用它。实际调用 push_back 的是 operator= 重载。

这模仿了指针等自然迭代器的行为。它允许 OutputIterator 假装允许您分配给现有值,而您实际上使用 operator= 调用 container.push_back . *++ 只是为了匹配 ForwardIterators 的接口(interface)。

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

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


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

auto it = back_emplacer(...);
*it++ = std::forward_as_tuple(...);

operator= 看起来像这样:

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;
}

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

关于c++ - 前/后插入器就位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48273319/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com