当需要访问容器时,返回迭代器而不是底层容器本身
Returning Iterators instead of underlying Container itself when access to the Container needed
在我的程序中有很多地方需要访问和修改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
一起),输出到屏幕,甚至处理元素而不将它们存储在任何地方,例如计算集合中项目的统计信息。
- 访问者访问变体并返回不同类型时出错
- 在 C++ 中访问数组负索引处的内存不会返回垃圾
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 我可以从标准::访问返回汽车吗?
- 访问包含P的有效索引时返回空格的C++字符串
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- 为什么访问模板化变体作为返回值抛出异常
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 访问冲突投射到无效*并返回
- C++ TensorFlow SoftmaxCrossEntropWithLogits 返回(成本、梯度),如何访问成本
- 如何在 C++ 中从 void 返回函数访问变量
- 访问range_expression中的嵌套元素会返回不完整的映射(段错误)
- C++ 为什么访问数组中的元素会返回指针?
- CUDA 中的递归返回非法内存访问
- 进程退出,返回值3221225477访问多维向量
- 如何在返回向量中访问系数
- CreateFile 在尝试打开目录进行读取时始终返回错误 5(访问被拒绝)
- 为引用返回访问器定义获取和设置行为
- Bcp_init返回访问冲突