gpt4 book ai didi

c++ - std::stack> 的深拷贝

转载 作者:行者123 更新时间:2023-11-30 02:10:57 25 4
gpt4 key购买 nike

我想实现 std::stack< boost::shared_ptr<T> > 的拷贝.没有3份有什么办法吗?这是代码:

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();
}
}

最佳答案

如果你想保持顺序,你会有点卡住,因为堆栈不提供任何迭代器。如果您不想使用双端队列,您至少可以通过按值传递源堆栈来使代码更清晰(并且更高效 under certain circumstances ):

template<typename T>
void copyStackContent(std::stack< boost::shared_ptr<T> > & dst,
std::stack< boost::shared_ptr<T> > 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)) );
}
}

不过,我对复制 shared_ptrs 指向的值持怀疑态度。如果无论如何都要复制所有内容,为什么还要动态分配?

关于c++ - std::stack<boost::shared_ptr<T>> 的深拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4087403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com