2012-10-26 7 views
6

Ich brauche nur die iequals-Zeichenfolgevergleichsfunktion aus der BOOST-Bibliothek zu verwenden.Kann ich eine einzelne Funktion aus einer Bibliothek in C++ einfügen/importieren?

Ich verwende #include <boost/algorithm/string.hpp>, um es zu importieren.

Gibt es eine Möglichkeit, dass ich nur die iequals Funktion von selbst importieren konnte?

Der Grund, warum ich sogar kümmern (ich bin wirklich nur neugierig.) Ist, weil die kompilierte DLL ist etwa 230kB wenn ich nicht #include es tun und etwa 1,1 MB, wenn ich es tue. Es macht in diesem speziellen Fall keinen großen Unterschied, wie groß die Datei ist, aber es scheint, als ob es eine Menge Sachen gibt, die importiert und nie benutzt werden. Was wäre, wenn die Bibliothek ein paar GB groß wäre und ich nur eine der Funktionen benötige? Dann würde es ein Problem werden, stelle ich mir vor.

Ich bin zwar naiv, wenn es um fast alles cpp-bezogene geht, aber ich habe das Gefühl, dass es nicht sehr effizient ist, 750kB Code einzuschließen, wenn wahrscheinlich 90% davon nicht verwendet werden. Es könnte sein, dass die iequals Funktion alle diese 750kB verwendet, ich habe keine Ahnung.

Wenn die iequals-Funktion wiederum viele derselben Bibliotheken enthält, wäre die Datei immer noch genauso groß.

Gedanken?

Vielen Dank im Voraus für eine Beratung.

EDIT:

Vielen Dank für die Antworten. Ich tue mein Bestes, um sie zu verstehen.

Ich bin ein Chemieingenieur, der eine Reihe schrecklich langsamer und schlecht optimierter VBA-Makros in eine C++ - DLL umwandelt. Bisher waren die Ergebnisse hervorragend und alles funktioniert einwandfrei. Ich sehe nur nicht die Notwendigkeit für die zusätzliche Dateigröße, wenn ich nur eine einzige Art von Vergleich zwischen zwei Strings machen muss.

Ein Beispiel für den Vergleich, den ich tun müssen, ist wie folgt:

if (SomeBSTR == "SomeTextHere") { 
    // do stuff 
} 

oder genauer:

if (Gas == "Methane" or 
    Gas == "CH4"  or 
    Gas == "C1")  return 1; 

if (Gas == "Ethane"  or 
    Gas == "C2H6"  or 
    Gas == "C2")  return 2; 

Wenn dies die einzige Art des Vergleichs ist, dass ich zu tun haben, können ich mache es auf einfachere Weise als:

int wStrCmp(const BSTR Str1, const wstring Str2) { 

    wstring wStr1(Str1, SysStringLen(Str1)); 

    return boost::iequals(Str1, Str2); 
} 

die über aufgerufen:

if (wStrCmp(Gas, L"Methane")  or 
    wStrCmp(Gas, L"CH4")   or 
    wStrCmp(Gas, L"C1"))   return 1; 

Die letzten 2 Blöcke sind praktisch aus meinem Code eingefügt.

Danke nochmal, Leute.

+1

Haben Sie überlegt, ['strcasecmp'] (http://linux.die.net/man/3/strcasecmp) (POSIX) oder [' _stricmp'] zu verwenden (http://msdn.microsoft.com/de) -us/library/k59z8dwe% 28v = vs.80% 29.aspx) (Windows) statt? –

Antwort

2

mir glauben, dass Sie schon gerade sind boost::algorithm::iequals aber es verwenden boost::range und std::locale, dass möglicherweise Sie sie nicht an anderen Stellen des Codes verwenden, so dass dieser Code viel größer machen, so dass ich denke, für Ihren Fall gibt es keine anderen Weg, um dies zu tun, es sei denn, Sie verwenden einige nicht-Standard-Funktion wie stricmp oder strcasecmp.

Wenn Sie Wide-Strings unter Windows (zB BSTR) vergleichen wollen, können Sie _wcsicmp von CRT oder lstrcmpiW von Windows-Runtime (deklariert in Kernel32.lib, die möglicherweise bereits mit ihm verbunden) verwenden.

+0

Vielleicht gibt es ein besseres was zu tun ist, was ich versuche, mit dem Vergleich zu tun. Ich muss ein BSTR (aus Excel) nehmen und es mit einem anderen String vergleichen (der momentan 'L" Text "' als den anderen String verwendet), unabhängig von der Groß-/Kleinschreibung. Der einfachste Weg, den ich gefunden habe, um die BSTR und die andere Zeichenfolge zu vergleichen, ist die Verwendung der 'L" Text für die andere Zeichenfolge und 'boost/algorithm/string.hpp' header. Ich wünschte nur, es nicht gemacht Die Dateigröße ist vierfach. – Dr3vvn45ty

+1

@ Dr3vvn45ty nicht, dass Sie nicht bereits gesucht haben, aber [lstrcmpiw()] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms647489 (v = vs.85) .aspx) tun, was Sie suchen, vielleicht nicht, aber zumindest einen Blick wert, da es Windows ist, wenn nicht, dann vielleicht [CompareString()] (http: // msdn. microsoft.com/en-us/library/windows/desktop/dd317759(v=vs.85).aspx) könnte eine bessere Option für Sie sein .. Just ideas. – WhozCraig

+0

@WhozCraig Vielleicht, wenn ich den BSTR zu einem LPCTSTR reduzieren könnte Ich werde das untersuchen. Danke. – Dr3vvn45ty