problem to fill a combination of containers

H

Helene Pinol

Dear All

I have a problem to insert elements in a combination of containers.
Here is the declaration of the container I would like to use:
vector< set<myElement> > myContainer(vectorSize,set<myElement>());
The size of the vector is known but not yet the sizes of the different
sets.
Within a for loop, I build some myElements and try to insert them in
the correct set with:
myContainer[num].insert(myElement);
num is strictly less than vectorSize
myElement is defined as a struct of 2 int and overloads the operator<
in order to do the insertion
With a vectorSize equals to 1, the first insertion is done OK but it
fails within the second insertion; with a vectorSize>1 sometimes even
the first insertion fails.

What I don't understand is that I've done something similar that works
with a vector of vector of int and using a push_back instead of the
insert.

Thanks for your help.

Hélène.
 
K

Karl Heinz Buchegger

Helene said:
Dear All

I have a problem to insert elements in a combination of containers.
Here is the declaration of the container I would like to use:
vector< set<myElement> > myContainer(vectorSize,set<myElement>());
The size of the vector is known but not yet the sizes of the different
sets.
Within a for loop, I build some myElements and try to insert them in
the correct set with:
myContainer[num].insert(myElement);
num is strictly less than vectorSize
myElement is defined as a struct of 2 int and overloads the operator<
in order to do the insertion
With a vectorSize equals to 1, the first insertion is done OK but it
fails within the second insertion; with a vectorSize>1 sometimes even
the first insertion fails.

What I don't understand is that I've done something similar that works
with a vector of vector of int and using a push_back instead of the
insert.

Please post real code instead of english descriptions.
 
H

Helene Pinol

Karl Heinz Buchegger said:
Helene said:
Dear All

I have a problem to insert elements in a combination of containers.
Here is the declaration of the container I would like to use:
vector< set<myElement> > myContainer(vectorSize,set<myElement>());
The size of the vector is known but not yet the sizes of the different
sets.
Within a for loop, I build some myElements and try to insert them in
the correct set with:
myContainer[num].insert(myElement);
num is strictly less than vectorSize
myElement is defined as a struct of 2 int and overloads the operator<
in order to do the insertion
With a vectorSize equals to 1, the first insertion is done OK but it
fails within the second insertion; with a vectorSize>1 sometimes even
the first insertion fails.

What I don't understand is that I've done something similar that works
with a vector of vector of int and using a push_back instead of the
insert.

Please post real code instead of english descriptions.

Here is how myElement is defined:
struct myElement {
int x1;
int x2;
public:
bool operator<(const myElement & myElt) const {
return (x2 <= myElt.x2);
}
};

Here is the declaration of the container and how I try to use it:
vector< set<myElement> > myContainer(vectorSize,set<myElement>());
for(int i=0; i<maxNum; i++) {
// some computations to get 'val' & 'num'
// some printings to check values of 'val' & 'num'
myElement myElt = {i+1,val};
pair<set<myElement>::iterator,bool> result =
myContainer[num].insert(myElt);
}

With 'vectorSize'=1, 'num' is equal to 0 as it should be. A first
'myElt' element can be inserted. For the following one, the program
crashes on the insertion instruction (not possible to check the values
of the 'result' pair).

Is it clearer? Do you need to know something else? Do you have any
idea about what I've done wrong?

Thanks for your help.

Helene.
 
J

John Harrison

Here is how myElement is defined:
struct myElement {
int x1;
int x2;
public:
bool operator<(const myElement & myElt) const {
return (x2 <= myElt.x2);
}
};

You certainly have a problem here. With this defintion of operator< it is
possible that both a < b and b < a could be true (if a.x2 == b.x2). That
could certainly be enough to crash the insert operation.

john
 
H

Helene Pinol

John Harrison said:
You certainly have a problem here. With this defintion of operator< it is
possible that both a < b and b < a could be true (if a.x2 == b.x2). That
could certainly be enough to crash the insert operation.

john

Here is my actual code. I hope everything relevant is here. Otherwise
do not hesitate to ask me for more details.

vector< set<sequencedTime> >
sequencedTimes(runwayNum,set<sequencedTime>());
int * times = new int[indivSize];
for(int i=0; i<indivSize; i++) {
int earliest = (_ptrFleet->GetAircraftWithIndex(i))->GetEarliestTime();
int latest = (_ptrFleet->GetAircraftWithIndex(i))->GetLatestTime();
int time = earliest + (indiv->_proportions) *
(latest-earliest);
times = time;
sequencedTime seqTime = {i+1,time};
int runwayLabel = (indiv->_runways);
pair<set<sequencedTime>::iterator,bool> result =
(sequencedTimes[runwayLabel-1]).insert(seqTime);
}

'runwayNum' is equal to 1
'indivSize' is equal to 10
They are arguments given to the program.
'earliest' and 'latest' are also data input to the program.
The arrays '_runways' and '_proportions' are of size 10 ('indivSize')
and contain the following values before entering the 'for' loop.
[runways] 1 1 1 1 1 1 1 1 1 1
[(aircraft)/proportion] (1)/0.074 (2)/0.000 (3)/0.057 (4)/0.033
(5)/0.031 (6)/0
..075 (7)/0.033 (8)/0.086 (9)/0.079 (10)/0.051
In the last execution, the first 'seqTime' is {1,160} and is inserted
ok and the second is {2,195} and makes the program crashes.

The 'sequencedTime' element is entirely defined as following:
struct sequencedTime {
int plane;
int time;
public:
bool operator<(const sequencedTime & st) const {
return (time <= st.time);
}
};
Using '<' or '<=' does not make a difference in the program's
behavior. That is it crashes at the second insertion with a 'cannot
read the memory' message.

I've done something pretty similar earlier in my program that works
with a vector of vector of int. Here is the code for this case:

vector< vector<int> > tmpSequences(runwayNum,vector<int>());
int * runways = new int[indivSize];
for(int i=0;i<indivSize;i++) {
int planeLabel = tmpSeq;
int runwayLabel = (rand()%runwayNum)+1;
runways[planeLabel-1] = runwayLabel;
tmpSequences[runwayLabel-1].push_back(planeLabel);
}

Again 'runwayNum' is equal to 1 and 'indivSize' to 10 and 'tmpSeq' is
an array of length 10 ('indivSize') that can be such as 3 4 5 1 7 9 6
2 10 8

Thanks to all of you for your help.

Hélène.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top