double
числа вместо int
? Трябва да сменим типа на глобалните масиви, аргументите на функциите, и част от локалните променливи. Това не е толкова много занимавка (няколко минути), но представете се да се налага да го правите всеки път, когато искате да ползвате тази структура данни. Ами ако структурата данни беше по-голяма? int
.int, double, long long, char, ...
), но това ще изисква много код, който до голяма степен се повтаря. И няма да може да работи ако искаме да ползваме структурата за нестандартен тип (примерно структура).int
-ове а другият с double
-и? Съвсем мазало.class ClassName {
public:
// Данни и функции
};
public:
) за сега не ви интересува. Той указва, че данните и методите след него ще могат да бъдат достъпвани от "извън" класа. Но тъй като никой друг, освен ние самите, няма да ползва въпросния клас, то може винаги всичко да бъде public
.class Set {
public:
const int MAX_SIZE = 1048576;
int setSize;
int setValues[MAX_SIZE];
int getSize() {
return setSize;
}
int getKth(int k) {
if (k >= 0 && k < setSize)
return setValues[k];
return -1;
}
int find(int val) {
int left = 0, right = setSize - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (setValues[mid] == val)
return mid;
if (setValues[mid] < val)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
void insert(int val) {
int idx = find(val);
if (idx != -1)
return;
setValues[setSize++] = val;
for (int i = setSize - 1; i > 0; i--) {
if (setValues[i - 1] < setValues[i])
break;
swap(setValues[i - 1], setValues[i]);
}
}
void erase(int val) {
int idx = find(val);
if (idx == -1)
return;
for (int i = idx; i < setSize - 1; i++)
setValues[i] = setValues[i + 1];
setSize--;
}
};
void printEvenAndOdd() {
Set even, odd;
fscanf(stdin, "%d", &n);
for (int i = 0; i < n; i++) {
int curNum;
fscanf(stdin, "%d", &curNum);
if (curNum % 2 == 0)
even.insert(curNum);
else
odd.insert(curNum);
fprintf(stdout, "Number of distinct even: %d, and distinct odd: %d\n",
even.size(), odd.size());
}
}
this
, който има стойност адреса на обекта. Така, например, можем да достъпваме данните чрез, в нашия случай, this->setSize
и this->setValues[]
. По нататък ще видите за какво се ползва той.Set() {
setSize = 0;
}
int a(42);
, което създава променлива a от тип int
със стойност 42, така може да направите конструктор, който да инициализира множеството ви с дадени числа, например Set s({7, 13, 42});
.Set(const Set& origin) {
setSize = origin.setSize;
for (int i = 0; i < setSize; i++)
setValues[i] = origin.setValues[i];
}
operator =
, тоест какво да се извърши, когато имаме classObject1 = classObject2;
. При него трябва да обърнем малко повече внимание какво се случва ако копираме обект в самия себе си, тоест classObject1 = classObject1;
.
Set& operator= (const Set& origin) {
if (this != &origin) { // Проверка дали не се присвояваме на себе си
setSize = origin.setSize;
for (int i = 0; i < setSize; i++)
setValues[i] = origin.setValues[i];
}
return *this;
}
malloc()
или new
), е хубаво (но не задължително!) да я изчистим, преди да разрушим обекта. Ако не го направим би се получило изтичане на памет (memory leak). Този метод се нарича деструктор (destructor). Неговият синтаксис е следният:
~Set() {
// В този случай не правим нищо, но ако имахме динамично заделена
// памет например, тук би било удачно да я освободим.
}
int
, double
, или каквото и да е друго (дори друг клас!).template <class T>
template <class T> class Set {
public:
const int MAX_SIZE = 1048576;
int setSize;
T setValues[MAX_SIZE];
int getSize() {
return setSize;
}
T getKth(int k) {
if (k >= 0 && k < setSize)
return setValues[k];
return -1; // Това в някои случаи може да не работи
}
int find(T val) {
int left = 0, right = setSize - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (setValues[mid] == val)
return mid;
if (setValues[mid] < val)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
void insert(T val) {
int idx = find(val);
if (idx != -1)
return;
setValues[setSize++] = val;
for (int i = setSize - 1; i > 0; i--) {
if (setValues[i - 1] < setValues[i])
break;
swap(setValues[i - 1], setValues[i]);
}
}
void erase(T val) {
int idx = find(val);
if (idx == -1)
return;
for (int i = idx; i < setSize - 1; i++)
setValues[i] = setValues[i + 1];
setSize--;
}
};
int
и един за double
:
Set <int> setOfInts;
Set <double> setOfDoubles;
int
-ове (допълнително трябва да дефинираме operator <
и operator ==
в нашия клас за да работи това):
Set < Set<int> > setOfSetsOfInt;
Selected text (if you see this, there is something wrong)
(Незадължително) E-mail за обратна връзка: