PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Überprüfen, ob set.insert erfolgreich war



`kk
22-07-2005, 19:40
Hallo.
Ich habe hier ein Set und möchte überprüfen, ob das Einfügen erfolgt ist oder nicht. Um das zu erreichen sind mir zwei Möglichkeiten eingefallen:

a) Einfach vorher prüfen, ob der neue Wert schon im Set ist
oder
b) Das zurückgegebene pair von insert anschauen. Da steht genau das drin, was ich wissen möchte.

Ich wollte es mal mit Methode b) versuchen, a) ist ja langweilig (und wahrscheinlich auch langsamer).
Hier mal ein Beispiel:


#include <utility>
...

// Hier würde ich gerne zurückgeben, ob param
// eingefügt worden ist oder eben nicht...
bool Klasse::methode( const string& param )
{
pair< iterator, bool > ret = m_set.insert( param );
return true;
}

Ich bekomme aber folgenden Fehler:


g++ -c -W -Wall -pedantic -O -c -o datei.o datei.cpp
datei.cpp: In member function `bool Klasse::methode(const std::string&)':
datei.cpp:29: error: type/value mismatch at argument 1 in template parameter
list for `template<class _T1, class _T2> struct std::pair'
datei.cpp:29: error: expected a type, got `iterator'
datei.cpp:29: error: ISO C++ forbids declaration of `ret' with no type
datei.cpp:29: error: cannot convert `
std::pair<std::_Rb_tree_iterator<std::string, const std::string&, const
std::string*>, bool>' to `int' in initialization
datei.cpp:29: warning: unused variable `int ret'
make: *** [datei.o] Error 1


Kann mir jemand sagen, was ich falsch mache?
Vielen Dank für Hilfe.

Kai

quinte17
22-07-2005, 22:50
ich kenne mich zwar nicht direkt darin aus, aber der compiler meckert, dass er ret nicht kenne? überprüfe die definition von ret..

desweiteren kennt er ja scheinbar iterator nicht... ich weiß zwar nicht was es macht, aber http://www.cppreference.com/iterators.html hier steht was dazu, und da ist die syntax ein wenig anders... (zu iteratoren :D)

vielleicht hilft des ja weiter..

wünsche dir noch nen schönen abend!
greetz

`kk
22-07-2005, 23:10
Ich kenne die Seite, nur leider ist die Definition des Iterators ja grad mein Problem. :D
Auf cppreference steht bei der Syntax von insert:



pair<iterator,bool> insert( const TYPE& val );

The return value is an iterator to the element inserted, and a boolean
describing whether an insertion took place.

Dementsprechend habe ich versucht ein pair-Objekt anzugeben um
dann über ret.second zu überprüfen, ob eine "Insertion" stattgefunden hat.

Wie müsste die entsprechende Zeile richtig lauten?

Danke & Gruß
Kai

Joghurt
23-07-2005, 13:26
Wenn du ein set<string> hast, müsstest du
pair<set<string>::iterator,bool> foo = S.insert(bar);schreiben.

`kk
23-07-2005, 14:10
Hey danke, so gehts.

Ich hatte immer


pair< set::iterator, bool > foo = m_set.insert( bar );
probiert.

Danke nochmal!

Gruß
Kai

Joghurt
23-07-2005, 19:17
Im übrigen kannst du, wenn du nur auf Erfolg testen willst, einfach
if (foo.insert(bar).second) {...}schreiben.

`kk
23-07-2005, 19:55
Danke, noch besser. :)

anda_skoa
24-07-2005, 13:53
Anmerkung: set::iterator hat noch nicht funktioniert, weil set ein Template ist und somit set::iterator noch nicht ausreichend spezifiziert ist.

Ciao,
_