我想實現一個std::stack< boost::shared_ptr<T> >
的副本。有沒有辦法做到沒有3份?下面是代碼:std :: stack的深拷貝<boost :: shared_ptr <T>>
template<typename T>
void copyStackContent(std::stack< boost::shared_ptr<T> > & dst,
std::stack< boost::shared_ptr<T> > const & src){
//// Copy stack to temporary stack so we can unroll it
std::stack< boost::shared_ptr<T> > tempStack(src);
/// Copy stack to array
std::vector< boost::shared_ptr<T> > tempArray;
while(!tempStack.empty()){
tempArray.push_back(tempStack.top());
tempStack.pop();
}
/// Clear destination stack
while(!dst.empty()){
dst.pop();
}
/// Create destination stack
for(std::vector< boost::shared_ptr<T> >::reverse_iterator it =
tempArray.rbegin(); it != tempArray.rend(); ++it){
dst.push(boost::shared_ptr<T>(new T(**it)));
}
}
進行了抽樣檢測:
void test(){
// filling stack source
std::stack< boost::shared_ptr<int> > intStack1;
intStack1.push(boost::shared_ptr<int>(new int(0)));
intStack1.push(boost::shared_ptr<int>(new int(1)));
intStack1.push(boost::shared_ptr<int>(new int(2)));
intStack1.push(boost::shared_ptr<int>(new int(3)));
intStack1.push(boost::shared_ptr<int>(new int(4)));
// filling stack dest
std::stack< boost::shared_ptr<int> > intStack2;
copyStackContent(intStack2, intStack1);
assert(intStack1.size() == intStack2.size()); // same size
while(!intStack1.empty()){
assert(intStack1.top() != intStack2.top()); // != pointers
assert((*intStack1.top()) == (*intStack2.top())); // same content
intStack1.pop();
intStack2.pop();
}
}
目標堆棧可能應該按值返回,而不是使用目標。 +1。 – 2010-11-03 13:43:10
那麼,我的T需要在分配時進行對齊,所以它不是真的使用新的,而是一個特定的分配器。 – tibur 2010-11-03 13:56:00
第一次複製之前不應該有tempArray.reserve(src.size())嗎?或者這會不成熟的優化? – Basilevs 2010-11-03 14:23:26