当前位置:  开发笔记 > 编程语言 > 正文

用于公开集合的有效替代方案

如何解决《用于公开集合的有效替代方案》经验,为你挑选了2个好方法。

在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;
};

通过这种方法,您不会暴露任何关于内部的东西,即您甚至一个集合.



1> David Joyner..:

很多时候调用者想要访问只是迭代集合.从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;
};

通过这种方法,您不会暴露任何关于内部的东西,即您甚至一个集合.



2> Shog9..:

如果您使用数组,向量等,RichQ的答案是一种合理的技术.

如果您正在使用未按序数值索引的集合......或者认为您可能需要在不久的将来某个时候......那么您可能需要考虑公开自己的迭代器类型,以及相关begin()/ end()方法:

class Blah
{
public:
   typedef std::vector mydata_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)
{
   // ...
}

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有