【发布时间】:2011-04-06 07:31:47
【问题描述】:
我有一些看起来像这样的代码:
std::set<int> s1, s2, out;
// ... s1 and s2 are populated ...
std::set_intersection(s1.begin(), s1.end(),
s2.begin(), s2.end(),
std::inserter(out, out.end()));
我读过如果插入集合的值紧跟在作为“提示”给出的迭代器之后,则插入可以在摊销的常数时间内完成。这在运行集合交集时显然是有益的,特别是因为写入 out 的所有内容都已按顺序排列。
如何保证这种最佳性能?创建std::inserter 时,out 是空的,所以out.begin() == out.end() 所以我看不出我指定out.begin() 或out.end() 作为提示有什么区别。但是,如果在将每个元素插入begin() 时解释这一点,我似乎不会获得最佳算法性能。这可以做得更好吗?
【问题讨论】:
-
@Ahsleys:至少通过选择
end,您不会对算法感到悲观,因为没有后续元素(因此节省了一次比较)。但是,我确实想知道(就像您一样)您传递的迭代器是否会真正演变或停留在开头/结尾。
标签: c++ stl insert iterator set