0

Hello,
I am getting very strange behavior on an STL set::insert() .

...
		//Rebuild the P_set
		P_set.clear();//destroy old P set (shallow only)
		assert( P_set.empty() );
		for(int i = 0 ; i < N ; i++){
			cout<<"addr="<< &(C_array[i])<<endl;
			pair<set<C*>::iterator,bool> p = P_set.insert( &(C_array[i]) );
			assert( p.second && "FAILED TO INSERT" );
		} 	
		assert( P_set.size() == N );
...

Very occasionally I fail the assert( p.second && "FAILED TO INSERT" );

No idea why, I print the addr out and they are all unique.

Any ideas?

4
Contributors
9
Replies
10
Views
6 Years
Discussion Span
Last Post by arkoenig
0

Post all your code. Maybe I can help. Did you found any error?

Edited by alexchen: n/a

0

Post all your code. Maybe I can help. Did you found any error?

I can't post my code.

But this little section clears the set, and then iterates thru an array, using each addr as a ptr. How could that fail to insert? It would mean the addr was not unique, but how is that possible here?

0

Remember a set can only have distinct elements, that might be the reason why it fails sometimes.

But the set is of C*, and they have to be unique because it iterates thru and array and gets addresses

0

Do you check if p.first points to the correct element?

Wait, is it possible that it is somehow looking at the value? Here is some output right before it fails:

...
0: addr=0xe62a58 val=4.05578e-05
0: addr=0xe62a98 val=5.2957e-05
0: addr=0xe62ad8 val=4.95495e-05
0: addr=0xe62b18 val=5.2957e-05
...

Could the compare function, somehow be causing it to look at the value?

0

Do you specify your own compare function or use the default?

I specify my own.

I made it a multiset and it seems to work on a few testcases....crossing my fingers hoping it will work on all.

0

How about posting your compare function? That seems to me to be the most likely cause of the problem.

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.