Итак, основная проблема здесь - обнаружение столкновений. Я бы обычно искал решение, в котором элементы добавляются в какую-то ассоциативную коллекцию. Как только новый элемент будет добавлен, вы должны быть в состоянии определить, содержит ли коллекция подобный элемент, что указывает на коллизию. Здесь вам может показаться, что вам нужен тип коллекции, который допускает дублирование элементов, таких как мультикарта STL. Quadraple (quadruple?), Очевидно, будет типом значения в ассоциативной коллекции, а тип ключа будет содержать данные, необходимые для определения того, представляют ли два элемента коллизию, то есть адрес и время памяти. Чтобы использовать стандартную ассоциативную коллекцию, такую как STL multimap, вам нужно определить некоторый порядок на ключах, определив operator <для типа ключа (я предполагаю, что C ++ здесь, вы не указали). Вы определяете столкновение как два элемента, в которых место в памяти идентично, а значения времени отличаются менее чем на некоторое пороговое значение. Упорядочение типа ключа должно быть таким, чтобы два ключа, представляющих коллизию, выглядели эквивалентно при упорядочении. Эквивалентность под оператором <выражается как a <b ложно и b <a также ложно, поэтому порядок может быть определен этим оператором: </p>
bool operator<( Key const& a, Key const& b ) {
if ( a.address == b.address ) {
if ( abs(a.time - b.time) < threshold ) {
return false;
}
return a.time < b.time;
}
return a.address < b.address;
}
Существует проблема с этим дизайном из-за того, что два ключа могут быть эквивалентны в <без равенства. Это означает, что два разных, но похожих Quadraples, то есть два значения, которые сталкиваются друг с другом, будут храниться под ключом <em>, равным в коллекции. Вы можете использовать более простое определение порядка
bool operator<( Key const& a, Key const& b ) {
if ( a.address == b.address ) {
return a.time < b.time;
}
return a.address < b.address;
}
Согласно этому определению порядка, сталкивающиеся элементы оказываются смежными в упорядоченном ассоциативном контейнере (но под разными ключами), так что вы сможете легко найти их на этапе постобработки после того, как все они будут добавлены в коллекцию. .