在MyVector

时间:2017-03-23 21:39:39

标签: c++ vector copy-on-write

我的班级存储了一组名称为

的对象
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;
}

任务是使用写时复制习惯用于提高效率。 我尝试了一些东西,但是我不知道为什么我们需要这个,如果我的班级没有这个写字副本就可以正常工作,我会读到这个成语:主要的想法是:当我们想写的时候我们创建真正的副本有目的的东西,写。 我的代码非常简单。请在我的代码中告诉我如何执行此操作?

1 个答案:

答案 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 正确地处理了这个问题。