indexOf Object in std::vector
-
Hallo,
Ich habe einen std::vectorstd::string* und möchte die Position haben, an
der sich der String "myString" steht.
Muss ich per const_iterator (oder ähnlichem) durchlaufen oder gibt es ne
kürzere STL-Variante?Gruß,
Vectorianer
-
Du musst durchiterieren da der String ja gefunden werden muss. Die Standardbibliothek bietet dazu Algorithmen an: z.B. find_if.
Alternativ könntest du ein Hashtable verwenden! Da müsstest du nicht zwangsläufig durch alle Einträge iterieren. Glaube TR1 stellt Hashtables zur verfügung, bin mir aber nicht sicher.
-
find_if mit eigenem Prädikat! Ansonsten vergleichst du nämlich nur die Pointer.
MfG SideWinder
-
SideWinder schrieb:
find_if mit eigenem Prädikat! Ansonsten vergleichst du nämlich nur die Pointer.
find_if gibts auch nur mit Prädikat

-
KasF schrieb:
SideWinder schrieb:
find_if mit eigenem Prädikat! Ansonsten vergleichst du nämlich nur die Pointer.
find_if gibts auch nur mit Prädikat

So isses, ansonsten gibts ja find.

-
Glaube SideWinder meinte, dass er nicht einfach equal_to<std::string *> nehmen soll weil er damit nur die Adressen vergleicht.
-
Ahh!
Klar, das is korrekt! 
-
template <typename AdaptableUnaryFuncT> struct ptr_predicate_t { ptr_predicate_t( AdaptableUnaryFuncT p ) : pred(p) { } bool operator()( typename AdaptableUnaryFuncT::argument_type const* obj ) const { return pred(*obj); } AdaptableUnaryFuncT pred; }; template <typename AdaptableUnaryFuncT> ptr_predicate_t<AdaptableUnaryFuncT> ptr_predicate( AdaptableUnaryFuncT p ) { return ptr_predicate_t<AdaptableUnaryFuncT>(p); } std::size_t index_of( std::vector<std::string*> const& c, std::string const& s ) { return std::distance( c.begin(), std::find_if( c.begin(), c.end(), ptr_predicate(std::bind2nd(std::equal_to<std::string>(), s)))); }Für einen
std::vector<std::string>wär's natürlich einfacher
-
WTF, oder?
-
namespace bll = boost::lambda; std::ptrdiff_t n = std::find_if(v.begin(), v.end(), *bll::_1 == s) - v.begin();EDIT 3: Ja, sapperlott, is das denn so schwer für mich?
