【发布时间】:2019-11-09 07:47:47
【问题描述】:
我有课
class Route
{
public:
Route(std::vector<int> locationIds, const ILocationSource&);
double getRouteLength() const;
bool operator<(const Route&);
private:
std::vector<int> locationIds_;
const ILocationSource& locationSource_;
};
getRouteLength() 通过遍历locationIds_ 并从ILocationSource 获取坐标来计算路线长度:
class ILocationSource
{
public:
virtual Location getLocation(size_t n) = 0;
};
struct Location
{
double x, y, z;
}
我不想将坐标存储在 Route 中,因为 Location 大约是 int ID 的 6 倍,如果我在内存中有很多长路线,这可能很重要。
问题在于Route::locationSource_ 难以实现移动语义,因此尝试在std::vector<Route> 上调用std::sort() 会报错。
我猜,简单的解决方案是将locationSource_ 更改为指向 const 的指针,但我想知道是否有人能看到更好的解决方案或模式。不能选择单例,因为ILocationService 可能同时有多个实现。
【问题讨论】:
-
请提供一个可重现的例子
-
std::reference_wrapper 的问题是我必须根据我的原始向量创建一个临时副本,并在排序后将原始副本分配给临时。
-
我认为没有必要提供可重现的示例。我可以破解代码,直到它自己编译和工作。问题标题可能不是最好的。我真正想知道的是,是否有某种方法可以满足
Route和ILocation之间的依赖关系,从而保持Route可移动/可复制。 -
关于你需要使用引用而不是值:对预期的内存使用做一些实际的数学运算。使用间接可能会影响性能。除非您需要更改 shared 坐标,否则 3 个双打太少了,使用副本(包装在 POD 结构中)可能要好得多。
标签: c++