009
06.04.2005, 16:57 Uhr
virtual
Sexiest Bit alive (Operator)
|
Zitat von (un)wissender: |
Mit std::vector<char*> hat man in diesem Fall die perfekte Lösung.
|
Ziemlich überzeugt, wie? Also, wie kommen denn die netten char* Objekte in den Vector rein? Bestimmt nicht mit Zauberhand, sondern durch stringstream und string, wie der OP sagte. Heißt doch frei übersetzt:
std::vector<std::string> ist die falsche Lösung, weniger weil man nicht in richtung char** kommen kann (dazu später), sondern weil es ein Performancekiller wäre. std::list<std::string> oder std::deque<std::string> wären hier ggf. die besseren Varianten.
std::vector<char*> ist vermutlich nicht die perfekte (keinesfalls die Standalone Lösung), weil irgendwo muß der Speicher der Strings ja verwaltet werden - vermutlich wohl in einem Container der std::string objekte aufnimmt...
Scheinbar benötigt man also beides, std::list<std::string> sowie ein ganz flaches char**. Ich würde also erstmal eine Hilfsklasse schreiben, welche aus einem Conteiner ein C Array basteln kann:
C++: |
#include <algorithm>
template<typename T> class c_array { public: private: T* array;
int array_size; public: /* Helper to ge the const char* of a string */ static const char* cpp2cstr(const std::string& s) { return s.c_str(); }
/* Construtor */ template<typename C> c_array(const C& container) { array = new T[array_size=container.size()]; std::transform(container.begin(), container.end(), array, &c_array::cpp2cstr); }
/* Destructor. */ ~c_array() { delete[] array; }
/* Getter */ const T* get() const { return array; }
/* Get size. */ int size() const { return array_size; } };
|
Ist jetzt nur so dahingeschrieben, mit Verbesserungspotential: möglicherweise will man eine bessere Kontrolle darüber haben, daß ein c_array und der initialisierende Container gleiche Lebenszeit haben; aber das setzt im Zweifel den EInsatz von smartPointern voraus und würde den Rahmen sprengen.
Einsetzen kann man das dann so (eigentlich für alle möglichen Container primitiver Typen):
C++: |
int main() { /* Container aufbauen. Hier vielleicht std::stringstream verwenden, keine Ahnung */ std::list<std::string> l; l.push_back("Eins"); l.push_back("Zwei"); l.push_back("Drei"); l.push_back("Vier");
/* Erzeuge ein c_array object, welches das C Style Array verwaltet, hole das C Array */ c_array<char const *> ca(l); const char* const* p = ca.get() ;
/* Demonstriere den Gebrauch */ for(int i=0; i<ca.size(); ++i) { std::cout<<p[i]<<std::endl; }
/* Die Destruktoren machen die Aufräumarbeiten */ }
|
-- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |