C++ 是否有更多的结构/类用于更好的命名约定?
我有如下输入数据C++ 是否有更多的结构/类用于更好的命名约定?,c++,struct,naming-conventions,C++,Struct,Naming Conventions,我有如下输入数据 //road graph: from and to 1 2 1 3 3 4 3 5 //next festive city: type and city_id 2 5 2 3 1 3 2 3 2 4 到目前为止,我创建了1个struct来表示这两种输入类型 struct MainData{ int data; int data_1; }; int main() { /*code omitted*/ for(int i=0;i<n-1;i
//road graph: from and to
1 2
1 3
3 4
3 5
//next festive city: type and city_id
2 5
2 3
1 3
2 3
2 4
到目前为止,我创建了1个struct来表示这两种输入类型
struct MainData{
int data;
int data_1;
};
int main()
{
/*code omitted*/
for(int i=0;i<n-1;i++){
cin>> highWays[i].data >> highWays[i].data_1;
}
for(i=0;i<m;i++)
{
cin>>queries[i].data>>queries[i].data_1;
}
/*code omitted*/
}
struct MainData{
int数据;
int数据_1;
};
int main()
{
/*代码省略*/
对于(int i=0;i>高速公路[i]。数据>>高速公路[i]。数据_1;
}
对于(i=0;i>查询[i]。数据>>查询[i]。数据_1;
}
/*代码省略*/
}
依我看,我不认为这是一个好的做法,因为data
和data\u 1
的目的不清楚。虽然添加另一个结构可能会引入更大的文件。因此,我不知道是否要创建两个结构来区分这些输入类型,这会导致更好的命名约定。有什么建议吗
添加另一个结构可能会引入更大的文件
如果这有助于提高可读性,那么这是一个非常好的折衷办法。添加另一个struct
以提高可读性不会增加编译程序的大小
struct
s主要是编译时工件。编译器使用它们来了解大小和字段偏移量。除非struct
带有虚拟成员函数,否则添加新的struct
不会增加程序的运行时占用空间。如果struct
s完全不相关,则将它们分离出来不会对内存或CPU造成任何损失
当您的代码>结构> /Cux>S相关时,C++让您拥有两个世界中最好的:生成基类,从中派生,并提供具有描述性名称的成员函数:
class GraphEdge {
protected:
int from;
int to;
GraphEdge(int f, int t) : from(f), to(t) {}
};
struct RoadEdge : public GraphEdge {
int fromRoad() { return from; }
int toRoad() { return to; }
RoadEdge(int f, int t) : GraphEdge(f, t) {}
};
struct CityEdge : public GraphEdge {
int fromCity() { return from; }
int toCity() { return to; }
CityEdge(int f, int t) : GraphEdge(f, t) {}
};
添加另一个结构可能会引入更大的文件
如果这有助于提高可读性,那么这是一个非常好的折衷办法。添加另一个struct
以提高可读性不会增加编译程序的大小
struct
s主要是编译时工件。编译器使用它们来了解大小和字段偏移量。除非struct
带有虚拟成员函数,否则添加新的struct
不会增加程序的运行时占用空间。如果struct
s完全不相关,则将它们分离出来不会对内存或CPU造成任何损失
当您的代码>结构> /Cux>S相关时,C++让您拥有两个世界中最好的:生成基类,从中派生,并提供具有描述性名称的成员函数:
class GraphEdge {
protected:
int from;
int to;
GraphEdge(int f, int t) : from(f), to(t) {}
};
struct RoadEdge : public GraphEdge {
int fromRoad() { return from; }
int toRoad() { return to; }
RoadEdge(int f, int t) : GraphEdge(f, t) {}
};
struct CityEdge : public GraphEdge {
int fromCity() { return from; }
int toCity() { return to; }
CityEdge(int f, int t) : GraphEdge(f, t) {}
};
我认为这是一个非常明显的例子:您正在从文件中读取两个非常不同的元组。第一个列表包含带有源索引和目标索引的图形边,而第二个列表包含带有类型和ID的城市 您应该首先担心代码的可读性、可理解性和可维护性。编译器将能够进行大量优化;您不太可能从您正在考虑的过早优化中获得任何好处。因此,下面是@dasblinkenlight的好答案(在您向我们介绍数据结构的用途之前,他写了这篇文章),我建议使用两种不同的数据结构:
class GraphEdge {
protected:
int from;
int to;
GraphEdge(int f, int t) : from(f), to(t) {}
};
class FestiveCity {
protected:
int city_type; // This should probably be an enum
int id;
FestiveCity(int t, int i) : city_type(t), id(i) {}
};
我认为这是一个非常明显的例子:您正在从文件中读取两个非常不同的元组。第一个列表包含带有源索引和目标索引的图形边,而第二个列表包含带有类型和ID的城市 您应该首先担心代码的可读性、可理解性和可维护性。编译器将能够进行大量优化;您不太可能从您正在考虑的过早优化中获得任何好处。因此,下面是@dasblinkenlight的好答案(在您向我们介绍数据结构的用途之前,他写了这篇文章),我建议使用两种不同的数据结构:
class GraphEdge {
protected:
int from;
int to;
GraphEdge(int f, int t) : from(f), to(t) {}
};
class FestiveCity {
protected:
int city_type; // This should probably be an enum
int id;
FestiveCity(int t, int i) : city_type(t), id(i) {}
};
我们需要更多关于文件中的值实际上应该是什么意思的信息。在任何情况下,
data
和data\u 1
都是非常无用的名称。如果文件行应该表示图形边缘,那么像source
和target
这样的名称如何?首先写清楚的、可维护的code。然后,当您完成配置文件并查看是否需要从此处更改内容时。您会惊讶于编译器可以用好的、易于理解的代码编写的优化量。@NathanOliver编译器可以用好的、易于理解的代码编写的优化量
您能举个例子吗?不太好明白here@Bla...抱歉,我有一个拼写错误,意思是说编译器可以用好的、易于理解的代码进行大量优化。例如,foo我们需要更多关于文件中的值实际含义的信息。在任何情况下,data
和data\u 1
都非常有用更少的名称。如果文件行应该表示图形边缘,那么像源代码和目标代码之类的东西怎么样?从编写清晰的、可维护的代码开始。然后当您完成配置文件并查看是否需要从那里更改内容时。您会惊讶于编译器可以用goo编写的优化数量d、 易于理解的代码。@NathanOliver编译器可以用好的、易于理解的代码进行多少优化
你能举个例子吗?不太明白here@Bla...抱歉,我有一个拼写错误,意思是说编译器可以用好的、易于理解的代码进行大量优化foo谢谢。但在我的情况下,后一种输入类型不是from
和to
,而是更像type
和city\u id
,请参阅更新的问题。因此,您上面的代码不适合我的需要。不过,谢谢您的建议。谢谢。但在我的情况下,后一种输入类型不是from
和to
>,但更像是类型
和城市id
,请参见更新的问题。因此,您上面的代码不符合我的需要。但是