Если я правильно понял вопрос, вы можете сделать это с помощью единственного std::vector
, который вы отсортируете после прочтения временных меток. После сортировки вы можете выполнить итерацию по вектору один раз (ну, по одному разу для каждого размера групп, который вы хотите определить), чтобы определить, где внутри вектора начинается каждая группа:
#include <stdio.h>
#include <vector>
unsigned int CalculateSecondsSinceMidnightOnFirstDay(int whichDay, int hours, int minutes, int seconds)
{
unsigned int ret = seconds;
ret += (minutes*60);
ret += (hours*60*60);
ret += (whichDay*24*60*60);
return ret;
}
unsigned int CalculateGroupIDFromSeconds(unsigned int secondsSinceMidnightOnFirstDay, unsigned int secondsPerGroup)
{
return (secondsSinceMidnightOnFirstDay/secondsPerGroup);
}
int main(int, char **)
{
std::vector<unsigned int> rows;
// parse out the .csv files and add the timestamps
// into (rows) here; for this example, I'll just fake it
rows.push_back(CalculateSecondsSinceMidnightOnFirstDay(3, 6, 2, 15));
rows.push_back(CalculateSecondsSinceMidnightOnFirstDay(0, 18, 35, 59));
rows.push_back(CalculateSecondsSinceMidnightOnFirstDay(2, 8, 12, 17));
rows.push_back(CalculateSecondsSinceMidnightOnFirstDay(2, 8, 12, 18));
rows.push_back(CalculateSecondsSinceMidnightOnFirstDay(2, 8, 12, 19));
// ... and so on
// Now sort the data so that all timestamps are listed in increasing order
std::sort(rows.begin(), rows.end());
// Now that the vector is sorted, we can calculate the offset of each group within it
const unsigned int groupSizeInSeconds = 10;
unsigned int prevGroupID = (unsigned int) -1;
for (size_t i=0; i<rows.size(); i++)
{
unsigned int curGroupID = CalculateGroupIDFromSeconds(rows[i], groupSizeInSeconds);
if (curGroupID != prevGroupID)
{
printf("Group #%u starts at index #%lu in the array\n", curGroupID, i);
prevGroupID = curGroupID;
}
}
return 0;
}
Если окажется, что вам нужно отслеживать другие данные из каждой строки CSV в дополнение к значению временной метки, вы можете заменить std::vector<unsigned int>
на std::vector<MyDataRecordClass>
, где MyDataRecordClass
- это определенное вами class
или struct
, которое содержит переменные-члены для значение timestamp и любую другую информацию, которую вам нужно хранить вместе с этим значением; в этом случае вам также необходимо реализовать метод operator < (const MyDataRecordClass &> const
от MyDataRecordClass
до return (this->_secondsSinceMidnightOnFirstDay < rhs._secondsSinceMidnightOnFirstDay);
, чтобы std::sort()
знал, как правильно отсортировать вектор в порядке возрастания меток времени.