Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » einheitsvektor: schnellste art die 1 zu finden :)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.10.2006, 21:13 Uhr
~beginner2
Gast


hallo,

ich habe einen std::vector<double> v
der nur an einer einzigen stellt die 1.0 hat - sonst nur 0.0.
wie kann ich auf schnellste weise den index der 1.0 bekommen?
komme ich da nicht um eine for-schleife mit if-abfrage herum?

danke für eure ratschläge
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.10.2006, 21:20 Uhr
0xdeadbeef
Gott
(Operator)


Du wirst eh nen Epsilon-Vergleich machen müssen. Prinzipiell kannst du dir da natürlich nen Funktor schreiben, der das macht, und den std::find übergeben, aber intern macht der da auch ne Schleife draus.

Allerdings - wenn du eh weißt, dass es sich um einen Einheitsvektor einer bestimmten Länge handelt, kannst du den evtl. auf andere Weisen darstellen, z.B. als Bitmaske. Oder du könntest dir einfach den Index der 1 merken. Es kommt da schon ein bisschen auf den use case an - was willste denn genau machen?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.10.2006, 21:35 Uhr
~beginner2
Gast


also ich habe einen vektor z.B mit 1000 elementen die alle mit 0.0 gefüllt sind und an einer stelle ist die 1.0.
jetzt erstelle ich mir in einer subroutine eine maske und anhand dieser maske lösche ich aus dem einheitsvektor NUR Nuller. d.h der index der 1.0 verschiebt sich.
jetzt bräuchte ich aber im nachhinein doch den index wieder.
meine erase funktion ist hier als erstes und darunter das struct dass mir den erase mit der maske vollzieht...
ich bin am überlegen ob ich da irgendwas reinpfrimeln kann - aber eher ungern


C++:
vector.erase( std::remove_if( vector.begin(),
                  vector.end(),
                  IS_MASKED( vector, mask ) ),
                  vector.end() );



struct IS_MASKED
{
    std::vector< bool > mask_;
    const std::vector< double >* erase_el_;
    
    IS_MASKED(const std::vector< double >& erase_el,
              const std::vector< bool >& mask) : erase_el_( &erase_el ),
                                                 mask_( mask )
    {
    }
    
    bool operator()(const double& f) const
    {
        return mask_[ ( &f - &*erase_el_->begin() ) % mask_.size() ];
    }
};

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.10.2006, 21:41 Uhr
0xdeadbeef
Gott
(Operator)


Wenn das so ist, würd ich mir den Einheitsvektor garnicht als Vektor vorhalten, sondern als Index der 1, und den dann ggf. senken anstatt ein Element aus dem Vektor zu löschen. Nachher aus dem Index einen Vektor zu bauen ist ja trivial.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: