我有我的班级,班级存储着一组带有其名称的对象

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


任务是使用写时复制习惯来命名,以提高效率。
我尝试了一些东西,但是我不确定为什么我们需要这样做,如果在没有这种写时复制的情况下我的课堂上一切正常,我读到了这个成语:主要思想是:当我们要编写时创建真实的副本有目的的写东西。
我的代码很简单。请给我一个提示,如何在我的代码中执行此操作?

最佳答案

抱歉,由于我的信誉点还不够,所以无法添加到评论中,因此我将其写为答案:

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


顺便说一句,在您的代码中,m_ref_ptr并未更改原始对象中的引用计数,即您是否可以这样做:

MyVector  a;
...
MyVector b = a;


那么您仍然会有a.m_ref_ptr ==1。std :: shared_ptr会妥善处理此问题。

10-08 08:37