Invalider List-Iterator bei std::tr1::unordered_set

badday

Erfahrenes Mitglied
Moin zusammen,

ich habe folgendes Szenario:

Ich habe einen container, genauer gesagt
C++:
std::tr1::unordered_set<point_s, hash_func> con;

Wobei point_s und hash_func folgendermaßen definiert sind:

C++:
class  point_s
{
	public:
		point_s(int _x, int _y): x(_x), y(_y) {}
		unsigned short x, y;
		inline bool operator<(const point_s &b) const
		{
			return (x<b.x || (x==b.x && y<b.y));
		}

		inline bool operator==(const point_s &b) const
		{				
			return (x==b.x && y==b.y);
		}
};

struct hash_func
{
	std::tr1::hash<int> int_hash;
	std::size_t operator() (const point_s &s) const
	{
		return int_hash(s.x)+int_hash(s.y);
	}
};


Nun habe ich in einer anderen Funktion, in der ich das set als konstante Referenz übergebe folgendes:
C++:
if(con.find(point_s(x, y))!=con.end())

Diese Anweisung führt aber zu einem Problem, denn, so die Debug-Nachricht, die list-iterators seien nicht kompatibel.

Im Debugger sehe ich des weiteren, dass "_Vec" folgendermaßen aussieht:
_Vec [9]({x=40 y=30 },{x=40 y=30 },{x=****? y=****? },{x=****? y=****? },{x=30 y=20 },{x=30 y=20 },{x=30 y=20 },{x=52685 y=52685 },{x=52685 y=52685 }) std::vector<std::list<point_s,std::allocator<point_s> >::_Iterator<1>,std::allocator<std::list<point_s,std::allocator<point_s> >::_Iterator<1> > >

Ich mache nur insert bzw. erase-Aufrufe.


Hat jemand eine Idee, wo das Problem liegen könnte?



Vielen Dank & Gruß,

badday
 
Hallo badday,

welchen Compiler verwendest du und wie ist die Fehlermeldung im Wortlaut? Ich kann dein Problem hier mit VS2010 nicht nachvollziehen.

Grüße,
Matthias
 
Hi.

Mach bitte mal ein vollständiges Minimalbeispiel.

Was ist denn _Vec? Und warum wird aus std::tr1::unordered_set plötzlich ein std::vector?

Gruß
 
_Vec ist ein
_STD vector<_Myvec_value_type, typename allocator_type::template rebind<_Myvec_value_type>::other>
der in xhash.h definiert ist.

Hm... Ich verstehe, dass dir ein Minimalbeispiel helfen würde, nur ist dies alles mit einen Algorithmus verzahnt, der relevante Code wäre sehr umfangreich.

Ich möchte eigentlich nur wissen, ob bei dem geposteten Code ein offensichtlicher Fehler ist oder ob jemand Möglichkeiten kennt, die zu einem solchen Verhalten führen könnten.


Gruß,

badday
 
Zurück