我有以下结构:
struct Point {
double x, y;
std::string name;
vector<vector<double>> matrix;
}
从一开始我就知道除最后一个属性matrix
之外的所有对象,为了计算matrix
,我必须知道其他一些对象。
但是我想将matrix
保留在Point
结构中。由于没有point_id
或类似的东西,这将允许我创建地图。
仅使用(x, y, name)
构造函数,然后稍后在代码中显式设置matrix
就是一种好的样式。
答案 0 :(得分:5)
仅使用(x,y,name)构造函数然后在代码中稍后显式设置矩阵是一种好样式。
是的,可以创建不包含任何元素的矩阵,并且如果可以确定其最终大小,则可以设置其容量。
答案 1 :(得分:2)
但是我想将矩阵保留在Point结构中。由于没有类似的point_id或sth,因此我可以创建地图。
对标准C ++ containers的误解。它们不需要任何类型的“ id”,并且映射只需要对其键的类型进行比较操作。
请记住,std::map可以与 explicit Compare
参数一起使用。您可能会提供一个仅比较x, y
和/或name
字段的字段。例如:
struct mycompare_st {
inline bool operator() (const Point& x, const Point& y) {
return x.name < y.name;
};
,并在定义适当的std::map<Point, Matrix, mycompare_st>
类之后使用Matrix
。
与std::set类似,它也接受比较函数,并且std::unordered_map可能被赋予相等运算和哈希运算,在某些情况下值得这样做。
顺便说一句,我认为将矩阵表示为向量的向量不是一个好主意(因为根据矩阵的定义,矩阵的每一列都具有相同的大小)。我建议您创建自己的Matrix
类(或抽象数据类型)。
仅使用(x,y,name)构造函数然后在代码中稍后显式设置矩阵是一种好样式。
编码风格实际上是一种见解,但是您建议的做法是通常的做法。
您还可以对矩阵使用某种smart pointer。了解<memory>
standard header。也许您的Point
可能包含一些
std::unique_ptr<Matrix> matrixptr;
字段?