在C++中,从性能和数据完整性的角度来看,我有哪些替代方案来展示集合?
我的问题是我想将一个内部数据列表返回给调用者,但我不想生成一个副本.Thant让我返回对列表的引用,或指向列表的指针.但是,我并不想让调用者更改数据,我只是想让它读取数据.
我是否必须在性能和数据完整性之间做出选择?
如果是这样,一般来说更好的是走一条路还是特别适合这种情况?
还有其他选择吗?
David Joyner.. 7
很多时候调用者想要访问只是迭代集合.从Ruby的书中拿出一页,让迭代成为你班级的私人方面.
#include#include class Blah { public: void for_each_data(const std::function & f) const { std::for_each(myPreciousData.begin(), myPreciousData.end(), f); } private: typedef std::vector mydata_collection; mydata_collection myPreciousData; };
通过这种方法,您不会暴露任何关于内部的东西,即您甚至有一个集合.
很多时候调用者想要访问只是迭代集合.从Ruby的书中拿出一页,让迭代成为你班级的私人方面.
#include#include class Blah { public: void for_each_data(const std::function & f) const { std::for_each(myPreciousData.begin(), myPreciousData.end(), f); } private: typedef std::vector mydata_collection; mydata_collection myPreciousData; };
通过这种方法,您不会暴露任何关于内部的东西,即您甚至有一个集合.
如果您使用数组,向量等,RichQ的答案是一种合理的技术.
如果您正在使用未按序数值索引的集合......或者认为您可能需要在不久的将来某个时候......那么您可能需要考虑公开自己的迭代器类型,以及相关begin()
/ end()
方法:
class Blah { public: typedef std::vectormydata_collection; typedef myDataCollection::const_iterator mydata_const_iterator; // ... mydata_const_iterator data_begin() const { return myPreciousData.begin(); } mydata_const_iterator data_end() const { return myPreciousData.end(); } private: mydata_collection myPreciousData; };
...然后你可以以正常的方式使用它:
Blah blah; for (Blah::mydata_const_iterator itr = blah.data_begin(); itr != blah.data_end(); ++itr) { // ... }