-
Notifications
You must be signed in to change notification settings - Fork 1
/
OSet.cpp
72 lines (63 loc) · 1.18 KB
/
OSet.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//
// Created by Stepan Dergachev on 08.07.18.
//
#include "OSet.h"
OSet::OSet() : IOpenContainer()
{
St = std::set<Node, bool(*)(const Node&, const Node&)>(compare);
dupl = false;
}
OSet::OSet (bool breakingties, bool allowduplicates) : IOpenContainer(breakingties)
{
dupl = allowduplicates;
if(this->breakingties)
{
this->compare = &gMaxCompare;
}
else
{
this->compare = &gMinCompare;
}
St = std::set<Node, bool(*)(const Node&, const Node&)>(compare);
}
OSet::OSet(OSet const &a) : IOpenContainer(a)
{
this->dupl = a.dupl;
this->St = a.St;
}
OSet::~OSet()
{
St.clear();
}
void OSet::Add(Node elem)
{
if(!dupl)
{
auto a = std::find(St.begin(), St.end(), elem);
if (a != St.end())
{
if (a->F > elem.F)
{
St.erase(a);
size -= 1;
}
else
{
return;
}
}
}
if(St.insert(elem).second)
{
size += 1;
}
return;
}
Node OSet::GetOptimal()
{
auto resit = St.begin();
Node result = *resit;
St.erase(resit);
size -= 1;
return result;
}