我的班级存储了一组名称为
的对象template <typename T>
class MyVector
{
private:
vector<T> objects;
vector<string> m_names;
size_t m_ref_ptr;
public:
MyVector()
{
m_ref_ptr = 1;
}
MyVector(const MyVector& other) : objects(other.objects),
m_ref_ptr(other.m_ref_ptr),
m_names(other.m_names)
{
m_ref_ptr++;
}
void push_back(const T& obj, const std::string& name)
{
copy_names();
objects.push_back(obj);
m_names.push_back(name);
}
void copy_names()
{
if (m_ref_ptr == 1)
{
return;
}
size_t temp_ref_ptr = 1;
vector<string> temp_names(m_names);
m_ref_ptr--;
m_ref_ptr = temp_ref_ptr;
m_names = temp_names;
}
任务是使用写时复制习惯用于提高效率。 我尝试了一些东西,但是我不知道为什么我们需要这个,如果我的班级没有这个写字副本就可以正常工作,我会读到这个成语:主要的想法是:当我们想写的时候我们创建真正的副本有目的的东西,写。 我的代码非常简单。请在我的代码中告诉我如何执行此操作?
答案 0 :(得分:0)
很抱歉,无法添加评论,因为我还没有足够的信誉点,所以我写这个作为答案:
鉴于 m_names 是 std :: shared_ptr ,在 copy_names 中(假设使用命名空间std ,你写的:
if (m_names.use_count() > 1) { // this is c++11
m_names = make_shared<vector<string>>(*m_names);
}
您可以删除 m_ref_ptr 成员,因为 std :: shared_ptr 会跟踪此情况。在构造函数中必须创建一个空向量:
MyVector()
{
m_names = make_shared<vector<string>>());
}
BTW,在你的代码中, m_ref_ptr 没有改变原始对象中的引用计数,即如果你已经完成了:
MyVector a;
...
MyVector b = a;
那么你仍然会有 a.m_ref_ptr == 1 。 std :: shared_ptr 正确地处理了这个问题。