力为的技术博客

联系 聚合 管理
  154 Posts :: 1 Stories :: 561 Comments :: 0 Trackbacks

一、需求:

现在需要用一个容器存放若干对象的指针(AObject*),对象指针在容器中的顺序按照对象某个属性(pObject->GetValue();)从低到高排序。

二、"解决"方法:

1. 使用std::set
set中的元素是按照一定的顺序的存放的(根据元素的大小)。通过制定set的第二个模板参数就可以让它按我们的要求顺序排放。

先写一个函数对象:

// object compare functor
class CompareObject
{
   
bool operator() (AObject* lhv, AObject* rhv)
  
{
      
return lhv->GetValue() < rhv->GetValue();
  }

}


// decleare the object container;
typedef std::set<AObject*, CompareObject> AObjectContainer;
   AObjectContainer setContainer;


这种方法有啥问题?
(见文后)

2. 使用std::list
list中的元素默认不会排序,需要我们“手动”排序。
用list这样声明:

typedef std::list<AObject*> AObjectContainer;
   AObjectContainer listContainer;


添加完元素后,再排序:

(1)使用std::sort?
可注意了,std::list貌似不支持用std::sort进行用户自定义排序,反正我是没有试成功(有兴趣的同学可以解释一下)。假如这样写是错误的:

std::sort(listContainer.begin(), listContainer.end(), CompareObject());


(2)使用list.sort()

listContainer.sort(CompareObject());


三、分析

方法1存在非常严重的问题——内存泄漏。
set中的元素是按序排列(此处是按object.GetValue()的大小排序,我们把这个值也叫key吧),注意的是set中不存在key值相等的元素。假如要插入的元素在set中已经存在会发生什么呢?是用新的元素替换原来的元素还是保留原来的元素呢?(有兴趣有时间的同学帮忙做个实验吧)但有一点可以肯定,有一个被遗失了。如果set中存放的是对象,还没啥问题。但现在set中存放的是指针,于是内存便泄漏了。
posted on 2009-03-10 22:47 力为 阅读(2774) 评论(9)  编辑 收藏 引用 所属分类: Tools

评论

# re: STL容器误用一则 2009-03-11 09:12 路人丁
"但现在set中存放的是指针,于是内存便泄漏了。" --- 只能说明你设计错误,既然你存指针,那么就应该自己保证释放;

“假如要插入的元素在set中已经存在会发生什么呢?是用新的元素替换原来的元素还是保留原来的元素呢?” --- 容器选择错误,如果你想保存相等值,那么应当用multiset,而不是set。  回复  更多评论
  

# re: STL容器误用一则 2009-03-11 09:18 力为
@路人丁
兄弟说的对。标题说的就是误用,肯定是设计的问题:),也就是说此处用set是肯定有问题的。  回复  更多评论
  

# re: STL容器误用一则 2009-03-11 09:22 Kevin Lynx
存档的指针指向的内存是由你自己来维护的,不是set来维护,所有有内存泄露,也是你自己的错误。

std::sort不能对std::list进行排序,那是因为std::sort只能对random-access iterator进行操作,std::list::iterator不是random-access的。所以std::list才自己提供了sort函数。

详细参看std::sort文档  回复  更多评论
  

# re: STL容器误用一则 2009-03-11 09:25 力为
@Kevin Lynx
此处假定在最后会把set中所有的指针删除。  回复  更多评论
  

# re: STL容器误用一则 2009-03-11 12:10 yindf
容器里存放对象指针,一般建议用smart_ptr.
原生指针遇到多态,就哭了。  回复  更多评论
  

# re: STL容器误用一则[未登录] 2009-03-11 12:16 apan
关于STL中的sort函数,看看这篇文章
http://www.stlchina.org/twiki/bin/view.pl/Main/STLSortAlgorithms  回复  更多评论
  

# re: STL容器误用一则[未登录] 2009-03-11 22:09 koobin
“假如要插入的元素在set中已经存在会发生什么呢?是用新的元素替换原来的元素还是保留原来的元素呢?”
你的set中存放的是指针,如果已经存在,那还能说明什么?覆盖不覆盖又有什么区别?
@路人丁
  回复  更多评论
  

# re: STL容器误用一则 2009-04-10 09:40 cui
用法,没错,只是你没有判断返回值,如果是重复插入,那么会返回pair<iterator, bool>.second = false, 不会出现内存泄露的  回复  更多评论
  

# re: STL容器误用一则 2013-03-04 16:32 tb
参考一下  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理