- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在我的学习过程中,我遇到了前后迭代器,我想知道是否有办法让它们就地创建容器元素。从文档来看,容器似乎需要实现 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/
在 J 中,我可以根据一些谓词就地更新数组的子集,如下所示: y (k}~) |. y {~ k =. I. '123' e.~ y =. '[1.2.3]' [3.2.1] 我意识到我可以在
我对根据其他2个向量中的值对矩阵的列进行排序感兴趣。例如,假设矩阵和向量如下所示: M = [ 1 2 3 4 5 6 ; 7 8 9 10 11
import pandas as pd df = pd.DataFrame([[1, 'li'], [2, 'la'], [3, 'lu']], columns=(['index', 'col']))
我正在玩这个设计 - http://codepen.io/meek/pen/MKPLLm - 并尝试制作一个 div 来显示文章图片、标题、描述和点赞计数器(很像 reddit)。我想让它有点响应,但
是否可以保证 realloc() 总是就地缩小缓冲区?因此: new_ptr = (data_type *) realloc(old_ptr, new_size * sizeof(data_type)
我已使用 viewDidLoad 中的此函数将 UIPageControl 固定在 Collection View Controller 的底部。 func setUpViewsAndConstra
我有一个 JavaScript,当您在输入框中键入内容时,它会通过 ID 查找输入中的字符串匹配项,如果在某个时候字符串不匹配,则该特定的 div 将设置为不显示.一切进展顺利,除了这里是我的标记示例
我升级到 MySQL 8.0.13 并尝试使用“ALGORITHM=INSTANT”添加新字段,但出现以下错误"错误代码:1845。此操作不支持 ALGORITHM=INSTANT。请尝试 ALGOR
我是一名优秀的程序员,十分优秀!