我有我的班级,班级存储着一组带有其名称的对象
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会妥善处理此问题。