Re: Performance help
Steve Chow wrote:
hi, i'm reading a binary data file, which is basically a list of 7296
offsets pointing to data blocks which represent scanlines containing
three numbers; leftx, id, rightx. i can read these fine and push them
into vectors using;
What kind of vector do you push these onto?
provinces? What type is that?
for (int a = 0; a < 7296; a++)
{
for (int c = 1; ; c=c+2)
> {
It's not clear to me why you're new'ing these each time through
the loop. Why not just make temps like,
cords temp_cords;
//province *temp_prov = new province;
//cords *temp_cords = new cords;
file.seekg (4*(7296+(1*c)+offsets[a]));
have to rewrite temp_cords-> as needed
file.read ((char *)&temp_cords->left, sizeof(short));
file.read ((char *)&temp_prov->id, sizeof(short));
file.read ((char *)&temp_cords->right, sizeof(short));
temp_cords->line = a;
province temp_prov;
temp_prov.lines.push_back (temp_cords);
provinces.push_back (temp_prov);
ok, here if you're deleteing in both cases,
if you use new, why not just delete
unconditionally?
delete temp_cords;
delete temp_prov;
if (temp_cords->right == 18944)
{
break;
}
and this whole else block has no real purpose
that I can see
else
{
delete temp_cords;
delete temp_prov;
}
}
}
while ugly and most likely wrong, i /assure/ you it works. here is my
problem; i want to move the line data of all areas with a matching id
into one vector, and then remove them. i was thinking something like
for (int a = 0; a < provinces.size (); a++)
{
for (int b = 0; b < provinces.size (); b++)
starting here from zero each time?
doesn't that mean that you'll count some
instances twice?
consider
.... b = a + 1; ....
BTW, if you have a vector,
std::vector<SomeType> vec;
then your for loop should probably look like:
for(std::vector<SomeType>::size_type i = 0; ...
some compilers will give an error if you use int.
{
if (provinces[a].id == provinces[b].id && a != b)
I don't know what provinces[a].id is, and I
don't know how it got initialized.
{
provinces[a].lines.push_back(provinces[b].lines[0]);
provinces.erase (provinces.begin()+b);
what should the next value of b be as
you go through the loop?
}
}
}
but this is SLOWER than slow and im sure its probably 100% wrong but
i'll never know because it apparently will takes hours to complete. i
should mention that the amount of elements in provinces is; 557,406.
Then perhaps you should construct a smaller data test set so you can
test your algorithm.
any alternative approaches that'll let me do this quickly on a Pentium
3 800?
And perhaps, more importantly correctly? I don't think that the
platform is relevant.
BTW, have you thought about std::map?
LR