Frage

Ich versuche, alle Elemente eines statischen String-Arrays bestmöglich zu durchlaufen.Ich möchte es in einer Zeile deklarieren und problemlos Elemente hinzufügen/entfernen können, ohne die Nummer im Auge behalten zu müssen.Klingt wirklich einfach, nicht wahr?

Mögliche Nichtlösungen:

vector<string> v;
v.push_back("abc");
b.push_back("xyz");

for(int i = 0; i < v.size(); i++)
    cout << v[i] << endl;

Probleme – es gibt keine Möglichkeit, den Vektor in einer Zeile mit einer Liste von Zeichenfolgen zu erstellen

Mögliche Nichtlösung 2:

string list[] = {"abc", "xyz"};

Probleme – keine Möglichkeit, die Anzahl der Zeichenfolgen automatisch zu ermitteln (soweit ich weiß).

Es muss eine einfache Möglichkeit geben, dies zu tun.

War es hilfreich?

Lösung

Der Boost Assign-Bibliothek scheint genau das zu sein, was Sie suchen.Es macht die Zuweisung von Konstanten zu Containern einfacher als je zuvor.

Andere Tipps

C++ 11 hat Initialisierungslisten hinzugefügt, um die folgende Syntax zu ermöglichen:

std::vector<std::string> v = {"Hello", "World"};

Unterstützung für diese C++ 11-Funktion wurde mindestens hinzugefügt GCC 4.4 und nur in Visual Studio 2013.

Sie können a prägnant initialisieren vector<string> aus einem statisch erstellten char* Array:

char* strarray[] = {"hey", "sup", "dogg"};
vector<string> strvector(strarray, strarray + 3);

Dadurch werden übrigens alle Zeichenfolgen kopiert, sodass Sie doppelt so viel Speicher benötigen.Sie können den Vorschlag von Will Dean verwenden, die magische Zahl 3 hier durch arraysize(str_array) zu ersetzen – obwohl ich mich an einen Sonderfall erinnere, in dem diese bestimmte Version von arraysize etwas Schlimmes bewirken könnte (leider kann ich mich nicht sofort an die Details erinnern). .Aber es funktioniert sehr oft richtig.

Wenn Sie sich wirklich für das Ein-Zeilen-Ding interessieren, können Sie auch ein Variadic-Makro definieren, sodass eine einzelne Zeile wie z DEFINE_STR_VEC(strvector, "hi", "there", "everyone"); funktioniert.

Probleme – keine Möglichkeit, die Anzahl der Zeichenfolgen automatisch zu ermitteln (soweit ich weiß).

Dafür gibt es eine Standardmethode, die viele Leute (einschließlich MS) als Makros definieren arraysize für:

#define arraysize(ar)  (sizeof(ar) / sizeof(ar[0]))

Deklarieren Sie in C++ ein String-Array wie folgt: char array_of_strings[][]

Zum Beispiel : char array_of_strings[200][8192];

fasst 200 Strings, wobei jeder String eine Größe von 8 KB oder 8192 Bytes hat.

verwenden strcpy(line[i],tempBuffer); um Daten in das String-Array einzufügen.

Eine Möglichkeit besteht darin, einen NULL-Zeiger als Flag-Wert zu verwenden:

const char *list[] = {"dog", "cat", NULL};
for (char **iList = list; *iList != NULL; ++iList)
{
    cout << *iList;
}

Du kannst den ... benutzen begin Und end Funktionen aus der Boost-Bereichsbibliothek, um die Enden eines primitiven Arrays leicht zu finden, und im Gegensatz zur Makrolösung führt dies zu einem Kompilierungsfehler anstelle eines fehlerhaften Verhaltens, wenn Sie es versehentlich auf einen Zeiger anwenden.

const char* array[] = { "cat", "dog", "horse" };
vector<string> vec(begin(array), end(array));

Sie können den Vorschlag von Will Dean verwenden [#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))], um hier die magische Zahl 3 durch arraysize(str_array) zu ersetzen – obwohl ich mich an einen Sonderfall erinnere, in dem diese bestimmte Version von arraysize etwas Schlimmes bewirken könnte (leider kann ich mich nicht sofort an die Details erinnern).Aber es funktioniert sehr oft richtig.

Der Fall, in dem es nicht funktioniert, ist, wenn das „Array“ eigentlich nur ein Zeiger und kein tatsächliches Array ist.Aufgrund der Art und Weise, wie Arrays an Funktionen übergeben werden (in einen Zeiger auf das erste Element umgewandelt), funktioniert es außerdem nicht über Funktionsaufrufe hinweg, selbst wenn die Signatur wie ein Array aussieht – some_function(string parameter[]) ist wirklich some_function(string *parameter).

Ich habe versucht, Craig Hs Antwort, dass Sie boost::assign verwenden sollten, positiv zu bewerten, aber ich habe keinen Repräsentanten :(

Auf eine ähnliche Technik bin ich im ersten Artikel von Andrei Alexandrescu gestoßen, in dem ich jemals gelesen habe C/C++-Benutzerjournal, Bd. 16, Nr. 9, September 1998, S.73-74 (haben Sie das vollständige Zitat, da es in den Kommentaren zu meiner Implementierung seines Codes steht, den ich seitdem verwende).

Vorlagen sind dein Freund.

Hier ist ein Beispiel:

#include <iostream>
#include <string>
#include <vector>
#include <iterator>

int main() {
    const char* const list[] = {"zip", "zam", "bam"};
    const size_t len = sizeof(list) / sizeof(list[0]);

    for (size_t i = 0; i < len; ++i)
        std::cout << list[i] << "\n";

    const std::vector<string> v(list, list + len);
    std::copy(v.begin(), v.end(), std::ostream_iterator<string>(std::cout, "\n"));
}

Anstelle dieses Makros könnte ich dieses vorschlagen:

template<typename T, int N>
inline size_t array_size(T(&)[N])
{
    return N;
}

#define ARRAY_SIZE(X)   (sizeof(array_size(X)) ? (sizeof(X) / sizeof((X)[0])) : -1)

1) Wir möchten ein Makro verwenden, um daraus eine Konstante zur Kompilierungszeit zu machen.Das Ergebnis des Funktionsaufrufs ist keine Konstante zur Kompilierungszeit.

2) Wir möchten jedoch kein Makro verwenden, da das Makro versehentlich auf einen Zeiger angewendet werden könnte.Die Funktion kann nur für Arrays zur Kompilierungszeit verwendet werden.

Wir nutzen also die Definiertheit der Funktion, um das Makro „sicher“ zu machen;wenn die Funktion existiert (d. h.es hat eine Größe ungleich Null), dann verwenden wir das Makro wie oben.Wenn die Funktion nicht existiert, geben wir einen ungültigen Wert zurück.

#include <boost/foreach.hpp>

const char* list[] = {"abc", "xyz"};
BOOST_FOREACH(const char* str, list)
{
    cout << str << endl;
}
#include <iostream>
#include <string>
#include <vector>
#include <boost/assign/list_of.hpp>

int main()
{
    const std::vector< std::string > v = boost::assign::list_of( "abc" )( "xyz" );
    std::copy(
        v.begin(),
        v.end(),
        std::ostream_iterator< std::string >( std::cout, "\n" ) );
}
#include <iostream.h>
#include <iomanip.h>

int main()
{
int n;
cout<<"enter the maximum number\n";
cin>>n;
cout<<"enter the first number\n";
for(int i=0;i<n;i++)
{

for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
}
cout<<"enter the second number\n";
for(int i=0;i<n;i++)
{
for(int k=0;k<n;k++)
{
cin>>b[i][k];
}
}
cout<<"the product will be\n";
for(int i=0;i<n;i++)
{
for(int g=0;g<n;g++)
{
c[i][g]=c[i][c]*c[i][j];
cout<<setw(5)<<c[i][g];
}
cout<<endl;
}
return 0;
}

Sie können ein Array von Zeichenfolgen wie direkt deklarieren string s[100];.Wenn Sie dann auf bestimmte Elemente zugreifen möchten, können Sie diese direkt abrufen s[2][90].Ermitteln Sie zu Iterationszwecken die Größe der Zeichenfolge mithilfe vons[i].size() Funktion.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top