Я бы хотел хранить кучу предметов в контейнере std::set
.
Эта структура данных должна обеспечивать быстрое решение о том, является ли конкретный входной диапазон, содержащийся в одном из диапазонов, который хранится в наборе, перегруженным при сравнении std::set
, чтобы использовать метод set::find
для проверки одного изэлементы в наборе содержат аргумент входного диапазона.
Он также должен поддерживать элемент диапазона, представляющий одну точку (start_range == end_range).
Вот моя реализация:
#include <iostream>
#include <map>
#include <set>
using std::set;
using std::map;
class range : public std::pair<int,int>
{
public:
range(int lower, int upper)
{
if (upper < lower)
{
first = upper;
second = lower;
}
else
{
first = lower;
second = upper;
}
}
range(int val)
{
first = second = val;
}
bool operator<(range const & b) const
{
if (second < b.first)
{
return true;
}
return false;
}
};
А вот как я тестирую свою структуру данных:
int main(int argc, const char * argv[])
{
std::map<int, std::set<range>> n;
n[1].insert(range(-50,-40));
n[1].insert(range(40,50));
n[2].insert(range(-30,-20));
n[2].insert(range(20,30));
n[3].insert(range(-20,-10));
n[3].insert(range(10,20));
range v[] = {range(-50,-41), range(30,45), range(-45,-45), range(25,25)};
int j[] = {1,2,3};
for (int l : j)
{
for (range i : v)
{
if (n[l].find(i) != n[l].end())
{
std::cout << l << "," << i.first << "," << i.second << " : "
<< n[l].find(range(i))->first << " "
<< n[l].find(range(i))->second << std::endl;
}
}
}
}
и вот результаты, которые я получаю:
1,-50,-41 : -50 -40 --> good
1,30,45 : 40 50 --> bad
1,-45,-45 : -50 -40 --> good
2,30,45 : 20 30 --> bad
2,25,25 : 20 30 --> good
Так что, как вы можете видеть, мой код действительно отлично поддерживаетдиапазон одной точки (-45 содержится в диапазоне (-50, -40), а 25 - в диапазоне (20,30))
Однако, что касается более широких диапазонов, мой текущий оператор <
способен найти отношение contained
, которое equal
для терминологии set
(имеется в виду, что для диапазонов a и b a<b && a<b
.
Есть ли способ изменить этот оператор, чтобы он работал?