【发布时间】:2017-02-19 08:10:03
【问题描述】:
为什么std::reverse(c.begin(), c.end()) 要求底层容器c 提供双向迭代器?
事实上,这意味着 (multi-)map, (multi-)set,但它们当然不能颠倒,因为它们是有序的。唯一的另一个 bi-dir 容器是 list,但它有自己的成员函数 .reverse()。
这意味着可以在array、vector 和deque 上应用std::reverse,它们是随机访问。
那么,为什么不“诚实”地说:需要随机访问,或者使用成员函数?
【问题讨论】:
-
因为这会对用户定义的迭代器造成不必要的限制
-
@krzaq 我也这么想。但我认为无法将指定的功能应用于 80% 的已交付潜在目标是很奇怪的。我可能会发明一个介于两者之间或正交的迭代器类别,比如“有序”之类的。特别是。因为这些参考页面上
std::reverse的文档中没有提到不适用性。也许在规范本身? -
我可以使用
map或set作为merge-target(需要输出迭代器)吗?remove在map和/或set上怎么样?可能不会,因为它们会重新排序,但那写在哪里? -
@krzaq 你可以把它写成答案。
-
"那么,为什么不“诚实”并说:需要随机访问" 因为不需要随机访问,所以这是不诚实的。
标签: c++ algorithm iterator reverse iterator-traits