如何向/从矢量添加/删除<unique_ptr>?



我使用unique_ptr而不是shared_ptr,因为它不是计数引用并且速度更快。您可以将其更改为shared_ptr.我的问题是如何正确添加/删除智能指针的矢量? 关键行如下:

CEO->add(std::move(headSales));
CEO->remove(headSales);

法典:

#ifndef EMPLOYEE_H
#define EMPLOYEE_H
#include <iostream>
#include <vector>
#include <memory>
class Employee
{
protected:
std::string name;
std::string department;
std::uint32_t salary;
std::vector<std::unique_ptr<Employee>> subordinates;
public:
Employee(std::string n, std::string d, std::uint32_t s) : name(n), department(d), salary(s)
{}
bool operator==(const Employee &e)
{
return name == e.name && department == e.department && salary == e.salary;
}
void add(std::unique_ptr<Employee> e)
{
subordinates.push_back(e);
}
void remove(const std::unique_ptr<Employee> e)
{
subordinates.erase(std::remove(subordinates.begin(), subordinates.end(), e), subordinates.end());
}
std::vector<std::unique_ptr<Employee>> getSubordinates() const
{
return subordinates;
}
};
#endif  //EMPLOYEE_H

#include "Employee.h"

int main()
{
std::unique_ptr<Employee> CEO = std::make_shared<Employee>("John", "CEO", 30000);
std::unique_ptr<Employee> headSales = std::make_shared<Employee>("Robert", "Head Sales", 20000);
CEO->add(std::move(headSales));
CEO->remove(headSales);
}

您的代码不需要唯一或共享的指针。

#ifndef EMPLOYEE_H
#define EMPLOYEE_H
#include <iostream>
#include <vector>
#include <memory>
class Employee
{
protected:
std::string name;
std::string department;
std::uint32_t salary;
std::vector<Employee> subordinates;
public:
Employee(std::string n, std::string d, std::uint32_t s) : name(n), department(d), salary(s)
{}
bool operator==(const Employee &e) const
{
return name == e.name && department == e.department && salary == e.salary && subordinates == e.subordinates;
}
void add(Employee e)
{
subordinates.push_back(std::move(e));
}
void remove(Employee const& e)
{
subordinates.erase(std::remove(subordinates.begin(), subordinates.end(), e), subordinates.end());
}
std::vector<Employee> getSubordinates() const
{
return subordinates;
}
};
#endif  //EMPLOYEE_H

#include "Employee.h"

int main()
{
Employee CEO = {"John", "CEO", 30000};
Employee headSales = {"Robert", "Head Sales", 20000};
CEO->add(headSales);
CEO->remove(headSales);
}

此外,您的==应该const,并且应该比较subordinates。 因为它现在是Employee的向量,所以递归地调用==

std::unique_ptr<Employee> CEO = std::make_shared<Employee>("John", "CEO", 30000);
^^^^^^                               ^^^^^^

这是错误的,因为共享指针不可转换为唯一指针。目前尚不清楚您是打算拥有共享所有权还是唯一所有权。


CEO->remove(headSales);
subordinates.push_back(e);

这些是错误的,因为您正在尝试复制唯一的指针。但是,唯一指针不可复制 - 否则它们不会保持唯一。相反,您必须从原始指针移动:

subordinates.push_back(std::move(e));

首先,使用唯一指针作为Employee::remove值的参数是不明智的。更多内容见下文。


std::vector<std::unique_ptr<Employee>> getSubordinates() const
{
return subordinates;
}

这次您尝试复制唯一指针的向量。问题仍然是一样的 - 指针不可复制。您也不能移动向量,因为函数是常量。也许您打算简单地授予读取访问权限。这可以通过返回引用来实现:

const std::vector<std::unique_ptr<Employee>>& getSubordinates() const

CEO->add(std::move(headSales));
CEO->remove(headSales);

您正在使用已从中移动的指针。唯一指针的所有权被唯一地转移到add,所以在移动之后使用它不再有意义。

正如我所提到的,使用唯一指针作为删除值的参数是没有意义的。为了拥有唯一的指针,您必须拥有该指针 - 唯一。因此,矢量不可能拥有它。您可以改为引用矢量中包含的指针,并使用它:

void remove(const std::unique_ptr<Employee>& e)
CEO->remove(CEO->getSubordinates().back());

您可以将其更改为shared_ptr.

好吧,那会简单得多。将所有unique替换为shared,并删除该std::move程序将格式正确。


附言。 您想要std::remove位于您忘记包含的<algorithm>标题中。

.PPS。我不清楚为什么员工应该拥有其他员工的任何所有权——唯一或共享。我建议所有员工都归其他东西所有——比如说Company,员工只有非拥有协会。我建议std::weak_ptr.

相关内容

  • 没有找到相关文章

最新更新