当需要访问Container时,返回Iterators而不是底层Container本身

时间:2011-12-22 11:23:14

标签: c++ stl map iterator

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

3 个答案:

答案 0 :(得分:0)

如果你真的需要引用map那么为什么要返回迭代器?

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

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

答案 1 :(得分:0)

我认为当您返回整个地图的迭代器时,会降低函数的实用性。该函数的使用者可以简单地编写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),输出到屏幕,甚至可以处理元素而不将它们存储在任何地方,例如计算集合中项目的统计数据。

答案 2 :(得分:0)

我过去也做过同样的事情,但现在更愿意返回对整个集合的引用。我担心迭代器保持有效。例如,如果我使用迭代器删除条目,它们仍然有效或者我是否需要再次获取它们?回归收藏感觉就像露出更多,但我觉得它更安全。