- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
来自 Rust 标准库 implementation of unzip
:
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB) where
FromA: Default + Extend<A>,
FromB: Default + Extend<B>,
Self: Sized + Iterator<Item=(A, B)>,
{
struct SizeHint<A>(usize, Option<usize>, marker::PhantomData<A>);
impl<A> Iterator for SizeHint<A> {
type Item = A;
fn next(&mut self) -> Option<A> { None }
fn size_hint(&self) -> (usize, Option<usize>) {
(self.0, self.1)
}
}
let (lo, hi) = self.size_hint();
let mut ts: FromA = Default::default();
let mut us: FromB = Default::default();
ts.extend(SizeHint(lo, hi, marker::PhantomData));
us.extend(SizeHint(lo, hi, marker::PhantomData));
for (t, u) in self {
ts.extend(Some(t));
us.extend(Some(u));
}
(ts, us)
}
这两行:
ts.extend(SizeHint(lo, hi, marker::PhantomData));
us.extend(SizeHint(lo, hi, marker::PhantomData));
实际上不要对 ts
或 us
进行任何扩展,因为 SizeHint
的 next
方法返回 无
。这样做的目的是什么?
最佳答案
这是一个很酷的把戏。通过提供此大小提示,它为 ts
和 us
提供了为循环中的 extend
调用保留空间的机会。根据documentation
size_hint()
is primarily intended to be used for optimizations such as reserving space for the elements of the iterator, but must not be trusted to e.g. omit bounds checks in unsafe code. An incorrect implementation ofsize_hint()
should not lead to memory safety violations.
请注意,SizeHint
的创建是必要的,因为 for 循环中的 extend
调用是使用 Some
值(可选
实现了 Iterator
特性),Some
值的 size_hint
是 (1, Some(1))
。这对预分配没有帮助。
但是查看 Vec
的代码, 这将无效(在 HashMap
和 VecDeque
中均无效)。其他 Extend
实现可能不同。
执行 ts.extend(SizeHint(lo, hi, marker::PhantomData));
不会触发 resize
,因为 next
返回 None
。也许有人应该写一个补丁。
impl<T> Vec<T> {
fn extend_desugared<I: Iterator<Item = T>>(&mut self, mut iterator: I) {
// This function should be the moral equivalent of:
//
// for item in iterator {
// self.push(item);
// }
while let Some(element) = iterator.next() {
let len = self.len();
if len == self.capacity() {
let (lower, _) = iterator.size_hint();
self.reserve(lower.saturating_add(1));
}
unsafe {
ptr::write(self.get_unchecked_mut(len), element);
// NB can't overflow since we would have had to alloc the address space
self.set_len(len + 1);
}
}
}
}
关于rust - Iterator::unzip 中 SizeHint 的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37074656/
我正在创建一个小部件,其中包含一个国际象棋 table 和六个按钮,这些按钮显示在国际象棋 table 下方的 2 行中。按钮行比棋盘宽。国际象棋表和按钮位于 QGridLayout 中。 Chess
我有一个 QAbstractItemDelegate 并且在 paint 方法中,我试图从标签中绘制文本。但我看到的问题是 QLabel 的大小提示对于它包含的文本来说总是太小。我怎样才能解决这个问题
我在 QSplitter 中有 QListView 和 QTabWidget。 QListView 正在使用自定义模型和自定义委托(delegate)。在委托(delegate)中,我重新实现了 pa
我有一个 QListView 有很多不同高度的项目。我实现了一个自定义委托(delegate)来绘制项目并将布局模式设置为批处理。 但是,当分配模型时, ListView 会预先为模型中的每个项目请求
我有两个小部件彼此相邻,WidgetA 和 WidgetB,在 QDialog 上,带有水平布局管理器。我正在尝试执行以下尺寸/调整尺寸政策: 对于 WidgetA: 水平方向:宽度应为 900,并且
我有一个启用了自动换行的自定义 QLabel。调整 MyWidget 的大小时,它会换行,但 sizeHint() 仍返回原始高度。 我尝试了这篇文章中的修复:QLabel cutting off t
我正在使用自定义编译的 Qt 库版本 4.8.5 和 MinGW GCC 4.8.2 以及 Qt Creator 3.0.1,我试图在中央小部件下的水平拆分器内设置两个选项卡小部件的 sizeHint
我想在布局中排列一堆 QPushButton,以便它们水平换行(如文本)。我正在尝试在 PySide2 中使用 Qt 示例 FlowLayout。 我发布了一个简单的示例 revision 2 her
背景 我正在 Python 2.7.6 中解析非常大的文本文件(30GB+)。为了稍微加快这个过程,我将文件分成 block ,并使用多处理库将它们分配给子进程。为此,我在主进程中迭代文件,记录要分割
我从 Swift 移植了一个带有可变高度单元格的 TableView 实现。但在我的 Xamarin/ReactiveUI 实现中,单元格不会在内容增长时调整大小(即显示可选标签时)。请注意,单元格会
来自 Rust 标准库 implementation of unzip : fn unzip(self) -> (FromA, FromB) where FromA: Default + Ex
因此,我使用 createWindowContainer 将自定义 QWindow 包装在一个小部件中。默认情况下,这会给出一个无效的大小提示 (-1),因为 QWindow 不在布局中。此外,QWi
我在 QTreeView 中有一个自定义的 QItemDelegate 绘图文本。在 paint() 中,我从样式中获取单元格的大小。然后,我使用当前单元格的宽度绘制带有自动换行的文本。 在sizeH
我有QTableView使用 QSqlQueryModel (它从 SQLite 中获取数据)。 有一个QStyledItemDelegate名为 MiniItemDelegate 的子类,我将其用作
我是一名优秀的程序员,十分优秀!