如果有起点和终点,我试图找出获取C-Array子集的最简单方法。
示例:我有一个班级旅行:
class Trip
{
private:
char* final_destination;
char* description;
public:
//all constructors, operators and stuff
};
而且,假设我有一系列旅行:
Trip* trips = new Trip[10];
我正在尝试编写一个函数,它接受Trip数组,起始点(给定目标),结束点(给定目标)并返回Trip *类型的子集。
E.g。
Trip* GetSubTrip(Trip* trips, char* start_point, char* end_point)
{
//Logics that returns Trip*
}
换句话说,如果我有:
[{"London", "Big Ben"}, {"New York", "Manhattan"}, {"Paris", "Eifell Tower"}, {"Moscow", "Lots of fun"}]
那将是旅行*旅行和"纽约"作为一个开始和"莫斯科"作为结束传递给 GetSubTrip 我试图让它返回Trip *。
回报必须是:
[{"Paris", "Eifell Tower"}, {"Moscow", "Lots of fun"}]
我的工作是:
但这是很多代码。我相信有更简单的方法。
修改
必须在不使用VECTOR的情况下完成!
答案 0 :(得分:1)
使用std::vector
:
std::vector<Trip> route;
bool go = false;
for( int i=0; i<tripsSize /* trips[i] != TRIP_GUARD */; ++i )
{
if( go )
{
route.push_back( trips[i] );
if( trips[i] == end )
break;
}
else if( trips[i] == start )
go = true;
}
为什么要使用std::vector
?您不必保持结果数组的大小。您可以自由方便地修改它。您不必担心Trip
个对象的内存分配。
如果你不想使用std::vector
,你需要为你的两个数组(输入和输出数组)提供某种保护,或者传递数组的长度。
没有std::vector
:
Trip * route;
int tripsNum;
int startNum, endNum;
for( int i=0; i<tripsSize /* trips[i] != TRIP_GUARD */; ++i )
{
if( trips[i] == start )
startNum = i;
else if( trips[i] == end )
{
endNum = i;
break;
}
}
tripsNum = endNum - startNum;
route = new Trip[ tripsNum ];
for( int i=startNum + 1, j=0; i<=endNum; ++i, ++j )
route[ j ] = trips [ i ];
答案 1 :(得分:0)
由于您使用的是C ++,因此可以考虑使用std :: vector类而不是原始C数组。
对于原始C数组,您需要将数组的大小(元素数)保持在某个位置。 如果您更喜欢数组,解决方案取决于您是否要修改原始数组/子数组。 如果不修改Trips数组,可以使用指针算法获取指向子数组的指针:
return trips + 2;//The returned pointer points to {"Paris", "Eifell Tower"}
您还需要存储子数组的大小。
如果你确实需要修改原始数组(和/或子数组),那么你必须创建一个副本(我强烈建议在这种情况下使用向量)。您可能会发现这很有用: Best way to extract a subvector from a vector?