Podeślę cały kod, bo nie bardzo mogę inaczej. Zmienne funkcji są dość solidnie opisane no i myślę, że estetyka do najgorszych nie należy. Gdzieś około 100 1-2 linijki (zaznaczone komentarzem) dają mi błąd 0xC0000005. Jeśli mnie pamięć nie myli to znaczy, że korzysta z niedozwolonej pamięci. Może coś robię źle z vectorami, nie wiem. Myślałem i kombinowałem pół godziny i nic narazie nie wykombinowałem.
Jeszcze dodam dla przyszłych pokoleń - ten kod jest niedopracowany w kilku miejscach - nie kopiujcie go.
#include <iostream>
#include <vector>
#include <functional>
#include <cmath>
using namespace std;
template <class T>
class TREE
{
private:
int last;
T neutral;
vector <T> con; //od contents
function<T(const T&, const T&)> func;
int mnwipo2(int s)
{
int i;
for (i = 1; i > s; i*=2){}
return i;
}
void refresh()
{
for (int i = con.size()/2 - 1; i >=0; i--)
{
con[i]=func(child1(i), child2(i));
}
}
int parentcode (int c)
{
return (c-1)/2;
}
int child1code (int p)
{
return 2*p+1;
}
int child2code (int p)
{
return 2*p+2;
}
public:
TREE(T neutral, function<T(const T&, const T&)> f) : func(f){last = 0;}
T parent (int c)
{
return con[(c-1)/2];
}
T child1 (int p)
{
return con[2*p+1];
}
T child2 (int p)
{
return con[2*p+2];
}
void add (T dod)
{
int s = con.size();
if (last == (s-1))
{
con.push_back(dod);
con.insert(con.end()-1, (s+1)/2, neutral);
con.insert(con.begin(), (s+1)/2, neutral);
refresh(); //Niezbyt efektywne, ale chwilowo efekt jest gites. Do dopracowania.
last++;
}
else
{
con [++last] = dod;
int i = parentcode(last);
while (parentcode(i) != i)
{
con[i]=func(child1(i), child2(i));
i = parentcode(i);
}
}
}
void cr_on_base (vector <T> & V) // Tworzy drzewo na bazie danych już zapisanych w wektorze
{
con.clear();
int s = V.size();
int pom = mnwipo2(s);
for (int i = 1; i < pom; i++)
{
con.push_back(0);
}//
con.insert(con.end()-1, V.begin(), V.end()); //gdzieś w tych dwóch linijkach się psuje
con.insert(con.end()-1, pom-s, neutral); //nie wiem w którym momencie i czemu dokładnie
refresh();
last = (2*pom - 1 - s);
}
T operator[](int i)
{
return con[i];
}
size()
{
return con.size();
}
};
float binarne (float a, float b)
{
return a+b;
}
int main()
{
TREE <double> drzewo (0, binarne);
double d;
int i, j, p, n, nr_pot;
cin >> n;
vector <double> V (n);
for (i = 0; i < n; i++)
cin >> V[i];
drzewo.cr_on_base(V);
cin >> d;
drzewo.add(d);
i = 0;
nr_pot = 0;
while (i < drzewo.size())
{
p = pow(2, nr_pot);
for (j = 0; j < p; j++)
{
cout << drzewo[i] << " ";
i++;
}
cout << endl;
}
return 0;
}