如何获得C-Array的子​​阵列

时间:2014-07-14 09:29:15

标签: c++ filter arrays

如果有起点和终点,我试图找出获取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"}] 

我的工作是:

  1. 在整数计数器中,我得到开始和结束之间的长度
  2. 创建一个新指针Trip *并使用1
  3. 中的计数器长度进行分配
  4. 迭代旅行'参数并保持跟踪,如果我在开始和结束之间,如果是 - >将对象添加到结果中,否则进一步进行处理。
  5. 但这是很多代码。我相信有更简单的方法。

    修改

    必须在不使用VECTOR的情况下完成!

2 个答案:

答案 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?