具体使用此代码
function myfunction(){
vector<T> foo,bar;
//..put some objects into foo via push_back
for(int i =0;i<foo.size;i++)
if(foo[i].hasCondition())
bar.push_back(foo[i]);
foo = vector<T>();
//do other stuff
}
foo或bar中没有包含的对象是否也被破坏了?如果不是,那么只能破坏foo中未被bar指向的对象的正确方法是什么?
答案 0 :(得分:1)
您的用例的正确算法是copy_if
:
#include <algorithm> // for copy_if
#include <functional> // for mem_fn
#include <iterator> // for make_move_iterator and back_inserter
auto it = std::make_move_iterator(foo.begin());
auto e = std::make_move_iterator(foo.end());
std::copy_if(it, e, std::back_inserter(bar), std::mem_fn(&T::hasCondition));
foo.clear(); // destroy what's left of them
(在make_move_iterator
中包装迭代器允许您有效地移动元素而不是制作副本并立即销毁原文。请将其视为不存在的move_if
算法的显式版本。)
答案 1 :(得分:1)
您可能希望按T
存储std::shared_ptr
类型的对象,而不是按值存储它们:
function myfunction(){
typedef std::shared_ptr<T> TPtr;
vector<TPtr> foo,bar;
//..put some objects into foo via push_back and make_shared
for(int i =0;i<foo.size;i++)
if(foo[i]->hasCondition())
bar.push_back(foo[i]);
foo = vector<T>();
//do other stuff
}
在您的代码中,您将基于foo
将部分对象从bar
复制到hasCondition()
,并且foo
中的所有对象在您分配{{1}时将被销毁}}