当需要访问容器时,返回迭代器而不是底层容器本身

Returning Iterators instead of underlying Container itself when access to the Container needed

本文关键字:返回 访问 迭代器      更新时间:2023-10-16

在我的程序中有很多地方需要访问和修改std::map数据结构。现在我有一个名为getMap()的方法,它实际上返回对std::map的引用。我正在考虑将迭代器返回到std::map而不是map本身,以获得更好的封装和性能。这样做是个好主意吗?或者就封装和性能而言,返回映射和返回迭代器一样好?

如果你真的只是需要一个对map的引用,那么为什么要返回迭代器呢?

如果需要指向映射的特定部分,迭代器并不总是封装得很好(它们是const吗?逆转?随机访问. . ?您的调用例程可能希望不受这些细节的影响,而裸迭代器不提供这种保护)。boost::range可能提供更好的解决方案。

对于其他一些容器(例如vector),如果在使用迭代器之前另一个例程修改了该容器,则迭代器将失效。根据程序的语义,您可能认为这会破坏封装。

我过去也做过同样的事情,但现在更喜欢返回对整个集合的引用。我担心迭代器是否有效。例如,如果我使用迭代器删除一个条目,它们仍然有效吗?还是我需要再次获得它们?返回集合感觉像是暴露了更多,但我觉得它更安全。

当你返回整个map的迭代器时,我认为你降低了函数的有用性。函数的使用者可以简单地编写getMap().begin()来获取迭代器。另一方面,他们可能对这些元素根本不感兴趣,他们可能想要clear()它或swap()它。

但是,当要输出集合的子集时,例如由谓词选择的范围或某些元素,通过输出迭代器返回数据比返回简化后的集合要好得多。

标准库一直这样做,例如copy()算法:

template<class InputIterator, class OutputIterator>
    OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result )
{
    while (first!=last) *result++ = *first++;
    return result;
}

这里result可以将元素附加到另一个集合类(与back_inserter一起),输出到屏幕,甚至处理元素而不将它们存储在任何地方,例如计算集合中项目的统计信息。