【发布时间】:2023-03-31 13:04:01
【问题描述】:
我正在使用这两个类
// This is generic data structure containing some binary data
class A {
public:
A();
A(const A&);
~A();
}
// Main data container
class B {
public:
B();
B( const B&);
~B();
protected:
std::vector<A *> data;
}
// Copy constructor for class b
B::B( const B& orig):data() {
for( std::vector<A *>::const_iterator it = orig.data.begin();
it < orig.data.end(); ++it){
data.push_back( new A( *(*it)));
}
}
我想这门课会做它的工作,但我正在寻找一种达到完美的方法。
首先,:data() - 这个初始化是否需要正确初始化空向量(是干净的代码)吗?
vector::iterator 在复制构造函数中是如何使用的?我发现的唯一方法是我已经写入代码的方法(复制构造函数应该强制使用 const)。
复制向量是否复制指针值而不是整个对象?
最后是新数据初始化...有没有办法用更少的代码替换整个循环和/或是否有任何标准如何为包含对象指针的 std::containers 编写复制构造函数?
子问题:我假设使用vector<A *> 比vector<A> 更适合和有效的各种原因(不是每次都复制,有权决定是否(不)复制对象......)这是假设正确吗?
【问题讨论】:
-
您的意思是“子问题:我假设使用指针向量...”
-
在初始化列表中预分配
data。像这样使用push_back()是非常无效的。 -
子回答:我认为,如果你可以不使用指针,你不应该使用它们。
-
我从未使用过 boost,但我确信它有解决这个问题的方法(它总是有解决看似常见问题的方法)。
-
正如公认的答案所示,正确处理所有异常是一件痛苦的事情。智能指针向量或对象
std::deque通常更好。 (另外,对于小对象,指针向量通常比对象向量慢;太多的间接和对 new/delete 的调用)
标签: c++ vector containers copy-constructor