Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Stl: find algorithm mit joker zeichen

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
26.08.2003, 12:36 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Ich hab schon gegoogeld aber leider nichts gefunden. Ich möchte so ein Auto competion sys machen wie in der console. Ich les nach jedem "Tastendruck" das ganze neu in einen STring ein

C++:
static char edit[1024];
m_c.GetWindowText(edit,1024);
typedef vector<CString> TVCString;
TVCString v;
v.push_back("Postmann");
v.push_back("Postgresql");


TVCString::const_iterator f = find(v.begin(), v.end(), edit);
if(f != v.end())
   AfxMessageBox((LPCTSTR)*f);
else
   AfxMessageBox("NO");


Nun möchte ich aber auch nach Möglichkeit bei der Eingabe von "Post" ein "NO" bekommen, da das ergebnis noch nicht eindeutig ist - das ist momentan der Fall.
Aber wie kann ich ihm sagen, dass ich bei "Postg" bereits das Ergebnis "Postgresql" haben will? gibs da jokerzeichen dfaür?

Danke im Voraus!!!!
mfg
--

Dieser Post wurde am 26.08.2003 um 12:38 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.08.2003, 12:48 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich habe da mal eine kleine Klasse zu geschrieben (Abbreviator heißt die), ich denke ich poste sie mal heute abend, wenn bedarf besteht: Die ist ziemlich universelkl einsetzbar und macht genau das, was du willst.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.08.2003, 12:52 Uhr
mike
Pinguinhüpfer
(Operator)


Das wär super, wenn das gehen würde
Danke!!!!!!!!
mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.08.2003, 18:05 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich hab noch zwei Bugs drin, deshalb bitte geduld. Kommt aber bestimmt heute im verlauf des Abends noch
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.08.2003, 19:13 Uhr
virtual
Sexiest Bit alive
(Operator)


Der Header:

C++:
/******************************************************************************
******************************************************************************

jolutil

Abbreviator.h, created Mon Jul 28 12:04:52 2003

   $Source: /joesoft/rep/jolutil/jolutil/source/libs/base/Abbreviator.h,v $

$Revision: 1.1 $

     $Name:  $

     $Date: 2003/07/29 23:04:43 $

    ------------------------------------------------------------------------

$Log: Abbreviator.h,v $
Revision 1.1  2003/07/29 23:04:43  joe
Initial added


******************************************************************************
*****************************************************************************/



#ifndef ABBREVIATOR_H_INCLUDED_
#define ABBREVIATOR_H_INCLUDED_ 1


/******************************************************************************
*
*  INCLUDES
*
*****************************************************************************/


#include <set>
#include <string>


/******************************************************************************
*
*  CLASS Abbreviator
*
*****************************************************************************/



/** String set with abbreviation lookup.
* This class is a set of strings (named keywords in the following). It
* provides an interface to look up these keywords with abbreviation. An
* abbreviation is the shortest substring of a keyword (starting with the
* first letter) that exactly matches only this keyword an nothing else.
*/

class Abbreviator
{
//  === TYPES =================================================================
private:
    /** Type the represents a keyword.
     * This is the type that represents a keyword, a simple string.
     */

    typedef std::string keyword_type;

    /** Type for a set of keywords.
     * This represents a set of keywords.
     */

    typedef std::set<keyword_type> keyword_set;

public:
    /** Type for counting items.
     * This represents a counter type.
     */

    typedef std::set<keyword_type>::size_type size_type;

    /** Iterator for keywords.
     * THis allows iterating through the keywords.
     */

    typedef std::set<keyword_type>::const_iterator iterator;

//  === ATTRIBUTES ============================================================
private:
    /** Set of keywords.
     * This set contains all keywords known to the abbreviator.
     */

    keyword_set m_setKeywords;

//  === PUBLIC INTERFACE ======================================================
public:
//! \name Construction, destruction
//@{
    /** Default constructor.
     * Creates a new Abbreviator with no keywords attached.
     */

    Abbreviator();

    /** Construction using a sequence of keywords.
     * This constructor expects two input iterators; all keywords of this
     * sequence are added to the keyword list.
     *
     * \param   p_iterBegin     1. input iterator
     * \param   p_iterEnd       2. input iterator
     */

    template<class I>
    Abbreviator(
        I p_iterBegin,
        I p_iterEnd);
//@}

//! \name Add and remove keywords-
//@{
    /** Add a single keyword.
     * This adds the keyword \a p_strKeyword to the list of keywords.
     *
     * \param   p_strKeyword
     */

    void insertKeyword(
        const std::string& p_strKeyword);

    /** Add a sequence of keywords.
     * This adds a sequence of keywords to the list of keywords.
     *
     * \param   p_iterBegin     1. input iterator
     * \param   p_iterEnd       2. input iterator
     */

    template<class I>
    void insertKeywords(
        I p_iterBegin,
        I p_iterEnd);

    /** Erases a single keyword.
     * Removes the keyword \a p_strKeyword.
     *
     * \param   p_strKeyword    Keyword to be removed.
     */

    void eraseKeyword(
        const std::string& p_strKeyword);

    /** Erases all keywords.
     * Removes all keywords
     */

    void clearKeywords();

    /** Get the count of keywords.
     * Returns the number of keywords known by this instance.
     *
     * \return  Keyword count.
     */

    size_type countKeywords() const;

    /** Begin iterator.
     * Returns iterator to first keyword.
     *
     * \return  Iterator.
     */

    iterator beginKeywords() const;

    /** End iterator.
     * Returns iterator to last keyword.
     *
     * \return  Iterator.
     */

    iterator endKeywords() const;
//@}

//! \name Abbreviations
//@{
    /** Get matches of an abbreviation.
     * This method returns all matches of the abbreviation \a p_strAbbreviation
     * and returns according iterators to the first and last match.
     *
     * \param   p_strAbbreviation   Abbreviation to be checked.
     * \param   p_riterBegin        Returns iterator to first match, or
     *                              end iterator if no match.
     * \param   p_riterEnd          Returns iterator to last match.
     *
     * \return  \c true, if at least one match.
     */

    bool getMatches(
        const std::string& p_strAbbreviation,
        iterator& p_riterBegin,
        iterator& p_riterEnd) const;

    /** Checks for unique match.
     * This method checks, whether the abbreviation matches exactly one
     * keyword. If the match is unique, the matched keyword is returned.
     *
     * \param   p_strAbbreviation   Abbreviation to be checked.
     * \param   p_rstrKeyword       Returns the matched keyword, if any.
     *
     * \returm  \c true, if unique match
     */

    bool isUniqueMatch(
        const std::string& p_strAbbreviation,
        std::string& p_rstrKeyword) const;

    /** Find abbreviation for a keyword.
     * This method tries to find the shortest abbreviation for the keyword
     * \a p_strKeyword, to that it uniquely matches the keyword.
     *
     * \param   p_strKeyword    Keyword that is abbreviated.
     *
     * \return  Shortest unique abbreviation, or "" if \a p_strKeyword is
     *          not a known keyword.
     */

    std::string findAbbreviation(
        const std::string& p_strKeyword) const;
//@}
};


/******************************************************************************
*
*  TEMPLATE FUNCTIONS
*
*****************************************************************************/



template<class I>
Abbreviator::Abbreviator(
    I p_iterBegin,
    I p_iterEnd)
    :m_setKeywords(p_iterBegin, p_iterEnd)
{
}


/ ----------------------------------------------------------------------------


template<class I>
void
Abbreviator::insertKeywords(
    I p_iterBegin,
    I p_iterEnd)
{
    m_setKeywords.insert(p_iterBegin, p_iterEnd);
}

#endif


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.08.2003, 19:15 Uhr
virtual
Sexiest Bit alive
(Operator)


Die Implementation:

C++:
/******************************************************************************
******************************************************************************

jolutil

Abbreviator.cpp, created Mon Jul 28 16:47:08 2003

   $Source: /joesoft/rep/jolutil/jolutil/source/libs/base/Abbreviator.cpp,v $

$Revision: 1.2 $

     $Name:  $

     $Date: 2003/08/26 17:10:24 $

    ------------------------------------------------------------------------

$Log: Abbreviator.cpp,v $
Revision 1.2  2003/08/26 17:10:24  joe
Fixed minor bugs

Revision 1.1  2003/07/29 23:04:43  joe
Initial added


******************************************************************************
*****************************************************************************/



/******************************************************************************
*
*  INCLUDES
*
*****************************************************************************/


#include "Abbreviator.h"


/******************************************************************************
*
*  CLASS Abbreviator
*
*****************************************************************************/



Abbreviator::Abbreviator()
{
}


// ----------------------------------------------------------------------------


void
Abbreviator::insertKeyword(
    const std::string& p_strKeyword)
{
    m_setKeywords.insert(p_strKeyword);
}


// ----------------------------------------------------------------------------


void
Abbreviator::eraseKeyword(
    const std::string& p_strKeyword)
{
    m_setKeywords.erase(p_strKeyword);
}


// ----------------------------------------------------------------------------


void
Abbreviator::clearKeywords()
{
    m_setKeywords.clear();
}


// ----------------------------------------------------------------------------


Abbreviator::size_type
Abbreviator::countKeywords() const
{
    return m_setKeywords.size();
}


// ----------------------------------------------------------------------------


Abbreviator::iterator
Abbreviator::beginKeywords() const
{
    return m_setKeywords.begin();
}


// ----------------------------------------------------------------------------


Abbreviator::iterator
Abbreviator::endKeywords() const
{
    return m_setKeywords.end();
}


// ----------------------------------------------------------------------------


bool
Abbreviator::getMatches(
    const std::string& p_strAbbreviation,
    iterator& p_riterBegin,
    iterator& p_riterEnd) const
{
    p_riterBegin = m_setKeywords.lower_bound(p_strAbbreviation);

    if (p_riterBegin != m_setKeywords.end() && p_strAbbreviation.length()>0)
    {
        std::string strTemp = p_strAbbreviation;
        strTemp[strTemp.length()-1]++;
        p_riterEnd = m_setKeywords.upper_bound(strTemp);
    }else
    {
        p_riterEnd = m_setKeywords.end();
    }

    return p_riterBegin != p_riterEnd;
}


// ----------------------------------------------------------------------------


bool
Abbreviator::isUniqueMatch(
    const std::string& p_strAbbreviation,
    std::string& p_rstrKeyword) const
{
    iterator iterPos = m_setKeywords.lower_bound(p_strAbbreviation);

    if (iterPos != m_setKeywords.end() && p_strAbbreviation.length()>0)
    {
        std::string strTemp = p_strAbbreviation;
        strTemp[strTemp.length()-1]++;
        iterator iterEnd = m_setKeywords.upper_bound(strTemp);
        if (p_strAbbreviation == iterPos->substr(0, p_strAbbreviation.length()))
        {
            if (--iterEnd == iterPos || p_strAbbreviation == *iterPos)
            {
                p_rstrKeyword = *iterPos;
                return true;
            }
        }
    }

    p_rstrKeyword.clear();
    return false;
}


// ----------------------------------------------------------------------------


std::string
Abbreviator::findAbbreviation(
    const std::string& p_strKeyword) const
{
    iterator iterPos = m_setKeywords.find(p_strKeyword);
    if (m_setKeywords.end()==iterPos) return "";

    std::string strReturn = *iterPos;
    std::string::size_type nLen = strReturn.length();
    std::string::size_type nSubLen = 1;

    if (iterPos!=m_setKeywords.begin())
    {
        iterator iterPrev = iterPos;
        std::string strPrev = *(--iterPrev);
        std::string::size_type i;
        for(i=0; i<strPrev.length() && i<nLen; ++i)
            if (strPrev[i]!=strReturn[i])
            {
                break;
            }
        if (i==nLen)
            return strReturn;
        nSubLen = std::min(i+1, nLen);
    }
    if (++iterPos!=m_setKeywords.end())
    {
        std::string strSucc = *iterPos;
        std::string::size_type i;
        for(i=0; i<strSucc.length() && i<nLen; ++i)
            if (strSucc[i]!=strReturn[i])
            {
                break;
            }
        if (i==nLen)
            return strReturn;
        nSubLen = std::max(std::min(i+1, nLen), nSubLen);
    }

    return strReturn.substr(0, nSubLen);
}



Bei Fragen bitte melden
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
26.08.2003, 20:29 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
1000 Dnak für den source
Leider hat Windowze damit ein Problem. Habs ohne vorkompilierte Headers kompilieren müssen. Dann hab ich (und das ist wahrscheinlich der Fehler) die #include <afxtempl.h> includen müssen, damit er std::min,... kennt.

error C2039: 'clear' : Ist kein Element von 'basic_string<char,struct std::char_traits<char>,class std::allocator<char> >'
error C2589: '(' : Ungueltiges Symbol auf der rechten Seite von '::'
error C2059: Syntaxfehler : '::'
error C2589: '(' : Ungueltiges Symbol auf der rechten Seite von '::'
....

Die beiden unteren Fehler beziehen sich auf

C++:
nSubLen = std::max(std::min(i+1, nLen), nSubLen);


Trotzdem Danke für deine Mühe!!!! Werd mir den Code trotzdem zu Gemüht ziehen - vielleicht schaff ich ja eines Tages den Sprung zwischen den Fronten

Danke nochmals!!!
mfg
--

Dieser Post wurde am 26.08.2003 um 20:30 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
26.08.2003, 23:59 Uhr
virtual
Sexiest Bit alive
(Operator)


Der VC ist ein wenig... naja.
Das Clear kannst Du ersetzen durch die zuweisung eines Leerstrings.
Beiden den anderen Fehlern nehme ich an, daß der VC macros definitiert, die min und max heissen. Grausam dieser Compiler. Hier hast du verschiedene Möglichkeiten:
Die beste möglichkeit dürfte sein, auf den Header afxtempl zu verzichten und stattdessen <algorithm> zu includieren.
Alternativen: du findest eine möglichkeit, dem VC zu sagen, daß er nicht min und max definieren soll, so nach der devise

C++:
#define BITTE_KEIN_MIN_MAX
#include "WindowsHeader.h"


Ich meine das gibt es, das define.
Oder du nimmst das std:: davor weg.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
27.08.2003, 07:08 Uhr
Tommix



'Morgen

aus Windef.h:

Zitat:

C++:
#ifndef NOMINMAX

#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif

#ifndef min
#define min(a,b)            (((a) < (b)) ? (a) : (b))
#endif

#endif  /* NOMINMAX */




Also vor virtuals code noch ein

C++:
#define BITTE_KEIN_MIN_MAX NOMINMAX




Gruss, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
27.08.2003, 08:28 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
Tommix postete

Also vor virtuals code noch ein

C++:
#define BITTE_KEIN_MIN_MAX NOMINMAX





Das sähe dem VC zwar ähnlich, aber ich denke

C++:
#define NOMINMAX


wäre sinnstiftender. Allerdings wegen der Eigenart der Windowsheader, allerhand Symbole zu definieren, die eigentlich schon im Standardnamensraum belegt sind, ist es die beste Strategie ganz af Windowsheader zu verzichten, das gibt nur ärger. Wenn Du die Klasse von mir ohne Windowskram gebaut kriegst, solltest Du sie anschliessend ohne Probleme dennoch in Windowsprogramme integrieren können, weil die Konflikte ja nur im Implementationsteil aufzutreten scheinen...
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 27.08.2003 um 08:31 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


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: